如何创建一个模板函数,它可以取不定数量的参数,并将这些参数传递给对象的正确构造函数?

我有以下模板函数...

template<class T> T *create_object(lua_State * L)
{
    // 获取由 Lua 管理的原始内存块。
    void *mem = lua_newuserdata(L, sizeof(T));
    // 在分配的内存中构造对象。
    T *object = new(mem) T;
    // 这里做其他事情...
    return object;
}

... 为在 Lua 脚本语言中使用而分配和设置 C++ 对象。我想扩展此函数,以便可以传递对象构造函数的参数。它可能看起来像这样:

template<class T> T *create_object(lua_State * L,??? ctor_args)
{
    void *mem = lua_newuserdata(L, sizeof(T));
    T *object = new(mem) T(ctor_args); // 根据参数调用正确的构造函数。
    // ...
    return object;
}

... 并且像这样工作:

class widget
{
    public:
        // 多个构造函数
        widget(); // #1
        widget(const widget &w); // #2
        widget(int width, int height, float x, float y); //#3
};

class font
{
    public:
        font(std::vector<uint8_t>);
}

// 其他具有多个构造函数的类。

// 示例用法:(L = lua_State 指针)
create_object<widget>(L); // 不传递参数-使用构造函数#1
create_object<widget>(L, existing_widget); // 传递一个参数-使用构造函数#2
create_object<widget>(L, 12864100.0f100.0f); // 传递4个参数-使用构造#3
create_object<font>(L, buffer); // 只是为了显示它需要适用于许多对象类型...
...等等...

避免最终变成这样的变长模板:

create_object<widget,intintfloatfloat>(L,256512120.0f0.0f);

真是太好了。

在 C++11 中是否可能?

更新:我目前正在使用带 -pedantic 的 gcc 4.6。最好使用非特定于编译器的解决方案。

原文链接 https://stackoverflow.com/questions/9922129

点赞
stackoverflow用户373025
stackoverflow用户373025
这样做的前提是您对变参模板有适当的支持:

template< class T, typename... Args > T *create_object( lua_State *L, Args&&... args) { void *mem = lua_newuserdata( L, sizeof( T ) ); T *object = new (mem) T(std::forward(args)...); // ... return object; }


即使您的构造函数有一些参数是(const 或非 const)引用,而其他参数是值类型,它也会正确地转发引用。 
2012-03-29 09:01:09