我有内存分配器,它为一个对象分配内存并用任何给定的参数调用它的构造函数,见下文。
// 0 args to constructor
template <class T>
inline T* AllocateObject() { return new (InternalAllocate(sizeof(T), alignof(T))) T(); }
// 1 args to constructor
template <class T, typename arg0>
inline T* AllocateObject(const arg0& a0) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0); }
template <class T, typename arg0>
inline T* AllocateObject(arg0& a0) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0); }
// 2 args to constructor
template <class T, typename arg0, typename arg1>
inline T* AllocateObject(arg0& a0, arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }
template <class T, typename arg0, typename arg1>
inline T* AllocateObject(const arg0& a0, arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }
template <class T, typename arg0, typename arg1>
inline T* AllocateObject(arg0& a0, const arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }
template <class T, typename arg0, typename arg1>
inline T* AllocateObject(const arg0& a0, const arg1& a1) { return new (InternalAllocate(sizeof(T), alignof(T))) T(a0,a1); }
//.........
正如您所看到的,呼叫数量随着参数的数量而迅速增长。我必须为每个参数替换'const'和'non-const',以确保它与我传递的任何参数一致。 (具体来说,能够通过引用传递以及通过值传递)
有没有比重复此方案更好的方法来执行相同的任务?基本上我看起来像8-10个参数最大,我感觉不太可行。
由于
答案 0 :(得分:4)
您可以使用可变参数模板。
template <class T, class... Args>
inline T* AllocateObject(Args&&... args) {
return new (InternalAllocate(sizeof(T), alignof(T)))
T(std::forward<Args>(args)...);
}
std::forward
调用将保留所有引用和const
ness。
请注意,这需要C ++ 11。最近的编译器已经支持可变参数模板(我不确定微软的模板)。
答案 1 :(得分:1)
不是模板解决方案,但变量参数#define
可以帮助您摆脱这个问题
确切的格式取决于您的编译器,但在MSVC中它将如下所示:
#define ALLOCATE_OBJECT(TYPE, ...) \
( new( InternalAllocate(sizeof(TYPE), alignof(TYPE)) ) TYPE(__VA_ARGS__) )