Đối với dự án hiện tại của tôi, tôi đã viết rất nhiều C/C++ cho trình bao bọc Lua. Một số lượng lớn trong số này là setters đơn giản và thu khí, vì vậy tôi cố gắng viết một số mẫu mà làm cho nó dễ dàng để tạo ra những, như vậy:Làm thế nào để sử dụng các mẫu variadic để tạo một hàm bao hàm Lua chung?
// Class Return Field
template <typename T, typename U, U T::*Member>
int luaU_get(lua_State* L)
{
T* obj = luaW_check<T>(L, 1);
luaU_push<U>(L, obj->*Member);
return 1;
}
static luaL_reg Foo_Table[] =
{
...
// Now I can just use this generic template to avoid
// writing simple getter functions
{ "getbar", luaU_get<Foo, Bar, &Foo::bar> },
...
};
Tôi muốn làm điều gì đó tương tự cho giấy gói chức năng đơn giản cho các chức năng tùy ý quá. Ví dụ, nó sẽ được tốt đẹp để có thể làm điều này:
template <typename T, typename U, U (T::*Func)(), typename... Args>
int luaU_func(lua_State* L)
{
// ...?
}
static luaL_reg Foo_Table[] =
{
...
{ "baz", luaU_func<Foo, int, &Foo::baz, int, float> },
...
};
Ý tưởng là các mẫu có hiệu quả bật ra được điều này khi biên soạn:
int luaU_func(lua_State* L)
{
luaU_push<int>(L, luaW_check<Foo>(L, 1)->baz(luaU_check<int>(L, 2), luaU_check<float>(L, 3)));
return 1;
}
tôi đã cố gắng chỉ sử dụng ...
expander, vấn đề đối với tôi là các giá trị chỉ số nguyên để ánh xạ tới các đối số thích hợp. Tôi không thể nghĩ ra cách để họ làm việc đúng. Một điều như vậy thậm chí có thể?
(có một chút kỳ diệu xảy ra ở đây đã, tôi đã viết một số giấy gói templated cho những thứ như lua_push và lua_check Tất cả những giấy gói hiện tại có thể được tìm thấy here.)
Bạn đã xem [luabind] (http://www.rasterbar.com/products/luabind.html) chưa? –
Bạn có đề xuất tôi sử dụng luabind không? Hay họ đã giải quyết một vấn đề tương tự mà tôi có thể sử dụng để tham khảo? (Tôi không quan tâm đến việc sử dụng luabind cho dự án của tôi vì một số lý do.) – Alex
Tôi chỉ không chắc chắn nếu bạn biết về nó. Dù sao, đối với các đối số & vấn đề chỉ số, [đây là ý tưởng cơ bản] (http://stackoverflow.com/a/8028333/168225). –