如何在 boost::fusion 序列上进行迭代?

我正在尝试初始化一个参数列表,用于与 fusion::invoke一起使用。 这些参数都是下面的 form:

template <typename Type>
struct ArgWrapper
{
    inline ArgWrapper(){}
    inline void Setup(lua_State*L,int idx)
    {
        //从lua state设置该值…
        //实际上,此类为不同的lua类型专门化
    }
    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)//打印3

但是,如果我有一个 FusionListType 类型的 fusion 序列,其中我知道序列中的每个类型都是某种类型的 ArgWrapper,则我如何迭代该列表并在每个元素上调用 Setup 函数(我只有一个 lua_State 指针,并希望将其用作第一个参数以用于 Setup,并希望使用序列中的位置作为第二个参数)。

因此,对于大小为 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);
}

但这无法编译,说“不允许函数模板部分专门化 'FillArgWrapper<ArgWrapperType,0>'”。

提前感谢。

原文链接 https://stackoverflow.com/questions/1136981

点赞
stackoverflow用户74013
stackoverflow用户74013

我弄明白了,我需要使用一个结构体:

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> //基本情况,不需递归
struct ArgWrapperListFiller<ArgWrapperList,0>
{
    static inline void Fill(ArgWrapperList &args,lua_State*L)
    {
        fusion::at_c<0>(args).Setup(L,1);
    };
};
2009-07-16 13:15:56