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.