私は、fusion :: invokeで使用するargsのリストを初期化しようとしています。 、だから私が行うことができますboost :: fusionシーケンスを反復処理する方法は?
template <typename Type>
struct ArgWrapper
{
inline ArgWrapper(){}
inline void Setup(lua_State*L,int idx)
{
//setup this value from the lua state...
//in reality this class is specialised for different lua types
}
operator Type(){return value;}
Type value;
};
例えば
int add(int a,int b){return a+b;}
fusion::vector<ArgsWrapper<int>,ArgsWrapper<int> > v;
fusion::at_c<0>(v).value=1;
fusion::at_c<1>(v).value=2;
std::cout<<fusion::invoke(add,v)//prints 3
しかし、私は順番に私が知っているタイプFusionListTypeの融合配列、それぞれのタイプを持っている場合です: argsが、フォームのすべてですいくつかの型のArgWrapper、どのようにそのリストを反復し、各要素のセットアップ関数を呼び出すことができますか(私はただ1つのlua_Stateポインタを持っていて、これをSetupの最初の引数として使いたい、そしてシーケンス内の位置を使いたい2番目の引数として)。
は、だから私は、得られるロジックになりたいサイズ3のベクトルのために:
lua_State*L;
fusion::at_c<0>.Setup(L,1);
fusion::at_c<1>.Setup(L,2);
fusion::at_c<2>.Setup(L,3);
私が試してみました:
template<typename ArgWrapperType,int N>
void FillArgWrapper(ArgWrapperType arg,lua_State*L)
{
fusion::at_c<N>(arg).Setup(L,N+1);
}
template<typename ArgWrapperType>
void FillArgWrapper<ArgWrapperType,0>(ArgWrapperType arg,lua_State*L)
{
fusion::at_c<0>(arg).Setup(L,1);
}
しかし、これはコンパイルに失敗し、function template partial specialisation ‘FillArgWrapper<ArgWrapperType, 0>’ is not allowed
を言って。
ありがとうございます。