나는 ... 그 할당을 다음과 같은 템플릿 기능 ...개체의 올바른 생성자에 인수를 전달하는 다양한 수의 인수를 사용하여 템플릿 함수를 만드는 방법은 무엇입니까?
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 여부)합니다 참조 및 기타 : 이것처럼
'lua_newuserdata'가 어떤 객체 크기에 대한 정렬을 보장하지 않는다면 (나는 그것이 모르는 지 모르겠다.),'sizeof (T)'만으로는 충분하지 않다. – ildjarn
@ idjarn Lua API가이 문제에 대해 충분히 설명되지 않았다고 생각합니다. 나는 기억이 정렬 될 것이라고 생각하지만, 명시 적으로 말하지는 않는다. 그냥 줄을 써야 겠어.'assert (reinterpret_cast (mem) % alignof (T) == 0)' –
bames53