首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何迭代boost::fusion序列?

如何迭代boost::fusion序列?
EN

Stack Overflow用户
提问于 2009-07-16 11:37:51
回答 1查看 2.1K关注 0票数 1

我正在尝试初始化要与fusion::invoke一起使用的参数列表。参数都是这样的形式:

代码语言:javascript
复制
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;
};

举个例子,我可以这样做

代码语言:javascript
复制
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的融合序列,其中我知道序列中的每个类型都是某种类型的ArgWrapper,我如何迭代该列表并对每个元素调用设置函数(我只有一个lua_State指针,并希望将其用作设置的第一个参数,而我希望使用序列中的位置作为第二个参数)。

因此,对于大小为3的向量,我希望得到的逻辑是:

代码语言:javascript
复制
lua_State*L;
fusion::at_c<0>.Setup(L,1);
fusion::at_c<1>.Setup(L,2);
fusion::at_c<2>.Setup(L,3);

我试过了:

代码语言:javascript
复制
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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-16 13:15:56

好了,我想通了。我需要使用一个结构:

代码语言:javascript
复制
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);
    };
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1136981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档