2009-07-16 19 views
1

私は、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を言って。

ありがとうございます。

答えて

4

私はそれを理解しました。私は構造体を使用する必要があります:

template <typename ArgWrapperList,u32 N=mpl::size<ArgWrapperList>::value-1> 
struct ArgWrapperListFiller 
{ 
    static inline void Setup(ArgWrapperList &args,lua_State*L) 
    { 
     fusion::at_c<N>(args).Setup(L,N+1); 
     ArgWrapperListFiller<ArgWrapperList,N-1>::Setup(args,L); 
    } 
}; 
template <typename ArgWrapperList> //base case, do not recurse 
struct ArgWrapperListFiller<ArgWrapperList,0> 
{ 
    static inline void Fill(ArgWrapperList &args,lua_State*L) 
    { 
     fusion::at_c<0>(args).Setup(L,1); 
    }; 
}; 
関連する問題