宏生成可疑错误 我一直在用C++编写内存管理器,并用宏来代替传统的调用新< /C>。这背后的动力有两个方面:我需要捕获有关请求分配的类型信息,并生成干净的语法。当然,对于宏来说,这是一项艰巨的任务。但我想到的是: #define anew( TYPE ) new ( Allocator::Instance( )->Allocate<TYPE>( ) ) TYPE

宏生成可疑错误 我一直在用C++编写内存管理器,并用宏来代替传统的调用新< /C>。这背后的动力有两个方面:我需要捕获有关请求分配的类型信息,并生成干净的语法。当然,对于宏来说,这是一项艰巨的任务。但我想到的是: #define anew( TYPE ) new ( Allocator::Instance( )->Allocate<TYPE>( ) ) TYPE,c++,templates,macros,C++,Templates,Macros,这真是太棒了!但是,当我尝试将其用于具有多个参数的模板化类时,它会爆炸(我的意思是它会生成错误) Obj*a=new(Obj)(); 这会导致没有为模板参数提供足够的类型参数。经过一些戳,我明白这是因为模板参数中的逗号。在这种情况下,如何解决此问题 更好的是,有没有更好的方法?我觉得把它变成一个宏是有意义的,因为我真的希望这里发生一些直接的文本替换。但我能从不同的方式处理这个问题中得到什么好处吗?不使用宏就可以实现这一点吗?我已经尝试过这种方法,但出现的问题是调用构造函数。以下代码无效,但最好

这真是太棒了!但是,当我尝试将其用于具有多个参数的模板化类时,它会爆炸(我的意思是它会生成错误)

Obj*a=new(Obj)();
这会导致没有为模板参数提供足够的类型参数。经过一些戳,我明白这是因为模板参数中的逗号。在这种情况下,如何解决此问题

更好的是,有没有更好的方法?我觉得把它变成一个宏是有意义的,因为我真的希望这里发生一些直接的文本替换。但我能从不同的方式处理这个问题中得到什么好处吗?不使用宏就可以实现这一点吗?我已经尝试过这种方法,但出现的问题是调用构造函数。以下代码无效,但最好是:

Obj* a = anew<Obj>( );
Obj*a=new();
其中括号只能对应于给定类型上的有效构造函数

任何帮助都将不胜感激。谢谢

[编辑]


尽管我也解决了问题,下面我选择的答案是我认为是我的问题最好的C++解决方案。感谢大家这么快就解决了这个问题。

使用C++11,您可以做到:

template <typename T,typename... Args>
T* anew(Args&&... args)
{
  return new(Allocator::Instance()->Allocate<T>()) T(std::forward<Args>(args)...);
}
模板
T*重新(Args&&…Args)
{
返回new(Allocator::Instance()->Allocate())T(std::forward(args)…);
}
现在您可以使用此表单:

Obj* a = anew<Obj>( );
Obj*a=new();
并将参数的任何内容(或任何内容)传递给构造函数


std::forward
是允许参数从一个函数转发到另一个函数的通用机制。它依靠右值引用和使用模板折叠引用的技巧,使左值和右值都能正确有效地传递。与变量相结合,这允许以这种方式完美地转发任意数量的参数。

只是一个猜测:尝试在
分配中的
类型
后添加一个空格,如下所示:
#定义一个新的(类型)新的(分配器::实例()->分配())键入
可以用解决。为什么不使用模板函数呢?@dasblinkenlight:我试过了。没有改变。谢谢你@M:我不能使用模板函数,因为我必须能够调用该类型的自定义构造函数。看看下面的帖子,看看我的意思。使用模板函数,我想你也可以调用自定义构造函数。先生,你真是太棒了。非常感谢。虽然为了让你的答案更好一点(我自己研究过),你可以在
std::forward
上加一点介绍。@WilliamCustde:我在我的答案中添加了一些。
template <typename T,typename... Args>
T* anew(Args&&... args)
{
  return new(Allocator::Instance()->Allocate<T>()) T(std::forward<Args>(args)...);
}
Obj* a = anew<Obj>( );