【问题标题】:How to iterate over a boost::fusion sequence?如何迭代 boost::fusion 序列?
【发布时间】:2010-11-11 08:10:11
【问题描述】:

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

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 类型的融合序列,我知道序列中的每个类型都是某种类型的 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);
}

但这无法编译,说function template partial specialisation ‘FillArgWrapper&lt;ArgWrapperType, 0&gt;’ is not allowed

提前致谢。

【问题讨论】:

    标签: c++ boost lua boost-fusion


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2012-08-18
      • 2016-06-23
      相关资源
      最近更新 更多