2012-03-29 6 views
1

나는 ... 그 할당을 다음과 같은 템플릿 기능 ...개체의 올바른 생성자에 인수를 전달하는 다양한 수의 인수를 사용하여 템플릿 함수를 만드는 방법은 무엇입니까?

template< class T > T *create_object(lua_State *L)  
{ 
    // Get a raw block of memory, managed by Lua. 
    void *mem = lua_newuserdata(L, sizeof(T)); 
    // Construct the object in the allocated memory. 
    T *object = new (mem) T; 
    // Do other stuff here... 
    return object; 
} 

을 가지고 루아 스크립트 언어에서 사용하기위한 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); // Call correct constructor as determined by args. 
    // ... 
    return object; 
} 

을 ...이 같은 작업 :

class widget 
{ 
    public: 
     // Multiple constructors 
     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>); 
} 

// Other classes with multiple constructors. 

// Example usage: (L = lua_State pointer) 
create_object<widget>(L); // Pass no arguments - use constructor #1 
create_object<widget>(L, existing_widget); // Pass one argument- use constructor #2 
create_object<widget>(L, 128, 64, 100.0f, 100.0f); // Pass 4 arguments - use construct #3 
create_object<font>(L, buffer); // Just to show it needs to work with many object types... 
... and so on ... 

같이 끝나는 가변 인자 템플릿 방지 :

create_object<widget, int, int, float, float >(L, 256, 512, 120.0f, 0.0f); 

하는 것이 좋을 것인가를 .

C++ 11에서도 가능합니까?

업데이트 : 현재 - pedantic이 켜져있는 상태에서 gcc 4.6을 사용하고 있습니다. 컴파일러가 아닌 특정 솔루션이 선호됩니다. 값을 기준으로

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>(args)...); 
    // ... 
    return object; 
} 

이 올바르게 앞으로 참조, 심지어 생성자에 의해 인수의 일부를 소요 (CONST 여부)합니다 참조 및 기타 : 이것처럼

+0

'lua_newuserdata'가 어떤 객체 크기에 대한 정렬을 보장하지 않는다면 (나는 그것이 모르는 지 모르겠다.),'sizeof (T)'만으로는 충분하지 않다. – ildjarn

+0

@ idjarn Lua API가이 문제에 대해 충분히 설명되지 않았다고 생각합니다. 나는 기억이 정렬 될 것이라고 생각하지만, 명시 적으로 말하지는 않는다. 그냥 줄을 써야 겠어.'assert (reinterpret_cast (mem) % alignof (T) == 0)' – bames53

답변

9

, 당신은 적절한 가변 인자 템플릿에 대한 지원을 제공했다.

+0

고맙습니다. 정확히 내가 무엇을 찾고 있었는지. –

관련 문제