テンプレート付きC++関数を暗黙的にすべてのポインタをvoid*
に変換する方法はありますか?私は軽量のLuaバインディングに取り組んでおり、void*
のバージョンが必要なときは、すべてのポインタ型に対して全く同じ関数を書くのを避けたいと思います。テンプレートをすべてのポインタ型に一致させる方法はありますか?
宣言:
template<class T>
T GetFromStack(lua_State* L, int index);
定義:私はmyVariable = GetFromStack<MyStruct*>(L, 0);
を呼び出すことだった場合
template<> void* GetFromStack<void*>(lua_State* L, int index)
{
return lua_touserdata(L, index);
}
、C++コンパイラは、私がMyStruct*
する機能を定義していないと文句を言うでしょう。 バージョンと暗黙的に一致するポインタタイプをにすることは可能ですか?
EDIT:
私は本当にわからないんだけど、私の質問は少し混乱している方法を見てどのように単語へ。私は自動バインディングシステムを考え出しています。このGetFromStack
関数は、別のテンプレート関数から呼び出されます。
template<class T_return, class T_param1, class T_param2 >
int LuaFunction(lua_State* L, T_return (*func)(T_param1,T_param2));
:
template<class T_return, class T_param1, class T_param2 >
int LuaFunction(lua_State* L, T_return (*func)(T_param1,T_param2))
{
T_param1 a = GetFromStack<T_param1>(L, 1);
T_param2 b = GetFromStack<T_param2>(L, 2);
T_return ret = func(a,b);
PushLuaType(L, ret); // <-- This is another templated function
// like GetFromStack that has the same problem
return 1;
}
私は、私は簡単なマクロでのLuaに公開したいものは何でも機能のLuaのバージョンを作成します。
#define DeclareLuaFunction(function) \
static int ##function##_lua_(lua_State* L) \
{ \
return LuaFunction(L, function); \
}
これはあまりにも長い間、私は事前に定義された型を使用すると、本当によく働きます。私はGetFromStack
のすべての "基本的な"タイプ(int、floatなど)用に書かれています。明らかにvoid*
です。しかし私は私のカスタムタイプのポインタのすべてのための1つを書く必要はありません。 MyStruct2
を使用する関数を作成すると、別のバージョンのGetFromStack
を書く必要があります。これは他のすべてのpointer
バージョンと同じです。
このシステムは、このように使用されます。その後、あまりにも整数としてMyStruct*
とT_param2
としてint
としてT_return
、T_param1
を持っているでしょう
struct MyStruct
{
int a;
float b;
};
int AddToMyStruct(MyStruct* s, int x)
{
int original = s->a;
s->a += x;
return original;
}
DeclareLuaFunction(AddToMyStruct);
。私はすでにint
バージョンのGetFromStack
とPushLuaType
を持っていますが、MyStruct*
バージョンはありません。今実装されている方法では、すべての実装が同じであっても、新しいタイプのGetFromStack
を作成する必要があります。
EDIT:型がポインタであるかどうかをコンパイルタイプで判断できる方法であれば、Andreasのソリューションがうまくいきます。私のT_param1がMyStruct*
であれば、それはMyStruct
ではなく、GetFromStack
にそのまま渡されます。
だからあなたは 'GetFromStackたい:として使用することができ
:今どんな専門を持つべきではありません(L、0)'のようなものを読んだとき、私は実際に何かを行うことができるように、 'void *'ではなく 'MyStruct *'を返すことを期待しています。タイプが何であるか分からないときは 'void *'を使用しますが、この場合は事前に何かを知っています。 –
GetFromStack
機能、(L、0) 'は' MyStruct * 'ではなく 'void *'を返しますか?私はそれが役に立つかもしれない方法を見ていない。 'GetFromStack私はあなたが何を求めているのか分かりません。ちょうど 'void * GetFromStack(lua_State * L、int index)'の何が間違っていますか? (つまり、テンプレートを使用していない) – CAFxX
あなたはちょっと混乱しているようです。 lua_touserdata()の仕様はまさにあなたが求めているものです! 'void * lua_touserdata(lua_State * L、int index);'。 'void *'だけが必要なものであれば、そのまま使用してください。 –