0

我有内存分配器,它为一个对象分配内存并使用任何给定的参数调用它的构造函数,见下文。

    // 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 个参数之类的东西,我觉得它不是很可行。

谢谢

4

2 回答 2

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属性。


请注意,这需要 C++11。大多数最新的编译器已经支持可变参数模板(不过我不确定微软的)。

于 2012-08-30T17:53:20.163 回答
1

不是模板解决方案,而是可变参数#define可以帮助您解决这个问题。
确切的格式取决于你的编译器,但在 MSVC 中它看起来像这样:

#define ALLOCATE_OBJECT(TYPE, ...) \
    ( new( InternalAllocate(sizeof(TYPE), alignof(TYPE)) ) TYPE(__VA_ARGS__) )
于 2012-08-30T18:24:52.977 回答