如何在 boost::fusion 序列上进行迭代?
2011-12-21 11:59:45
收藏:0
阅读:316
评论:1
我正在尝试初始化一个参数列表,用于与 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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我弄明白了,我需要使用一个结构体:
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); }; };