2009-07-16 6 views
1

J'essaie d'initialiser une liste d'arguments à utiliser avec fusion :: invoke. Les args sont de la forme:Comment itérer sur une séquence 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; 
}; 

donc je peux faire, par exemple

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 

Mais si j'ai une séquence de fusion de type FusionListType, où je sais que chaque type dans la séquence est un ArgWrapper d'un certain type, comment puis-je parcourir cette liste et appeler la fonction Setup sur chaque élément (j'ai juste un pointeur lua_State et je veux l'utiliser comme premier argument pour le Setup, et je veux utiliser la position dans la séquence comme deuxième argument).

Donc, pour un vecteur de taille 3 Je veux la logique résultante soit:

lua_State*L; 
fusion::at_c<0>.Setup(L,1); 
fusion::at_c<1>.Setup(L,2); 
fusion::at_c<2>.Setup(L,3); 

J'ai essayé:

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); 
} 

Mais cela ne parvient pas à compiler, en disant function template partial specialisation ‘FillArgWrapper<ArgWrapperType, 0>’ is not allowed.

Merci d'avance.

Répondre

4

Ok, je l'ai compris. Je dois utiliser une structure:

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); 
    }; 
}; 
Questions connexes