问题标签 [boost-fusion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何为 C++ 函数生成包装?
我正在尝试创建一种通用的方法来包装 C++ 函数(来自不同的语言)。我有一个参数列表(和一个迭代器)和一个要在参数列表上调用的特定 C++ 函数。我试图找到某种方式将参数列表解压缩为我的函数的参数。
我目前的做法是:
- 使用 Boost::FunctionTypes 以序列的形式获取函数的参数。
- 使用参数类型的值进行转换,创建一个包含参数值的 Boost::Fusion 列表。
- 使用 boost::fusion 的调用使用创建的列表调用函数。
步骤 (1) 和 (2) 看起来都相当简单。但是,我不知道如何进行第二步(或者如果它甚至可能——混合编译时和运行时似乎有点奇怪)。
有没有人知道如何做第二步,或者解决这个问题的更好方法?
我知道 Boost::Python 必须做类似的事情,但是代码有点密集,以便很好地了解正在发生的事情。
更新
我有一个部分解决方案,它适用于(至少)简单的情况。处理参考仍然存在问题。
希望有人可以发布更好的解决方案。
该列表包含指向基类 A 的指针,所有其他使用的类都从该基类派生。我有两个子类 B 和 C,它们包含不同的值类型(int 和 string)。
运算符 convert 接受给定的类并获取基础值。这些值通过转换收集到一个序列中,然后将其提供给调用。
最后,调用一个函数:
c++ - 摆脱 boost::fusion 序列中的引用
我正在尝试使用 Boost::Fusion 将函数的参数类型列表转换为 fusion::list。最终,我试图将变量列表转换为可以调用函数的参数(http://stackoverflow.com/questions/11164914/generating-wrappings-for-c-functions)。
我已经让它适用于非引用变量。但是,当我尝试打开函数的参数列表时(特别是在 fusion::to_list 上它抱怨它无法取消引用迭代器)时,它无法编译非引用变量。
我在下面简化了代码:
如果 foo 定义为:
它工作正常,但它会中断:
就我的代码而言,我实际上并不需要保留在序列中的引用,我认为这是问题所在(此外,我所做的搜索倾向于指出这是罪魁祸首)。但是,我不完全确定在调用transformed
之前如何剥离这些引用的功能as_list
。
我尝试了一些类似的东西:
但得到了相同的编译错误。
关于如何解决这个问题的任何想法?
更新
对于上面给出的两种情况,这是我得到的截断编译器错误(使用 clang++ --std=c++0x):
c++ - 在融合图中查找元素的索引
我正在努力寻找我正在寻找的一小部分功能。
我有一个包含fusion::map
. 我想使用可变参数构造函数来初始化该映射中的元素。
我希望最简单的方法是fusion::vector
从构造函数参数构造 a ,然后for_each
在地图上调用,并将每对的值设置为向量中的相应元素。
但是,为了做到这一点,我需要根据其键类型计算该对的索引。( pair::first_type
)
谁能帮我?
请看下面的示例代码:
c++ - 使用 Boost Spirit 和 Fusion 以关联方式解析结构
我正在尝试将键值字符串解析为结构。有些键值可能不存在或者顺序不同,所以我想用它boost::fusion
来调整结构,然后用at_key<>
指令解析成它。
问题是代码无法编译(Boost 1.50.0,g++ 4.5.0,MinGW),显然在at_key<>
规则上失败了:
如果我使用更简单的规则(没有关联性),一切都可以编译并且工作正常,但是这个解决方案有点脆弱:
为什么我不能at_key
在语义动作中使用?有没有更好的方法将“关联”解析为非关联结构?
c++ - 如何实例化没有默认构造函数的类型的 boost::fusion::vector 成员变量?
我正在学习 boost::mpl 并且我有以下课程-
这很好用,只要我使用带有默认构造函数(或默认类型)的类型
但是,如果我使用没有默认构造函数的类型,则会引发编译器错误,因为向量初始化失败。有没有一种标准方法来正确初始化成员(在构造函数中)而不诉诸指针/引用?
c++ - C++:使用 fusion::at 时出现 BOOST_FUSION_ADAPT_STRUCT 错误
在 Boost.Fusion 文档中,它说 BOOST_FUSION_ADAPT_STRUCT 使结构成为完全兼容的 Boost.Fusion 随机访问序列。
我尝试了以下方法:
我从编译器收到一个错误,说“没有匹配的函数调用 at(Str&)”。
我使用的编译器是 g++。
我究竟做错了什么?
提前致谢。
c++ - C++ 使用 boost fusion adapt_struct 迭代到嵌套结构字段
两个stackoverflow 答案建议使用 fusion adapt_struct 迭代结构字段的方法。这种方法看起来不错。但是,如何迭代到本身就是结构的字段?
按照前面的答案,我想出了下面的代码。问题在于代码无法编译的“#if 0”子句。作为替代解决方案,我创建了“decode()”函数来获取指向目标参数的 void 指针。这可行,但在编译时会丢失类型信息。有更好的解决方案吗?
我在维基百科上看到,您可以使用 typeid 和 dynamic_cast,而不是传递类型字符串“intype”。但这只会是很小的改进。我正在寻找一种更适合 C++ 或增强语言设计的解决方案。
c++ - fusion::nview 和 const 令人头疼
我已经被困在代码中一段时间了。我可以解决这个问题,但如果我什至无法编译代码,我会感到非常糟糕。代码中描述了这些问题。
请任何人都可以指出我错过了什么。
c++ - 包装一个 Boost.Fusion 序列
我正在寻找一种方法来创建一个Boost.Fusion序列包装器,它本身就是一个Fusion序列,并将所有“调用”转发到它的包装序列。有点像
wheresequence_wrapper< Sequence >
也是一个Fusion序列,并且可以正常工作Sequence
。我需要这个的原因是我有几个在Fusion序列上运行的函数(其中所有元素都满足一些特殊要求),并且我想添加一些语法糖,我需要一个自定义类型来添加重载运算符。我也不需要对 sequence_wrapper 的操作结果来返回一个 sequence_wrapper,只有与语法糖相关的调用会返回一个(手动)包装的序列。例如,使用逗号运算符将元素附加到序列(有点像Boost.Assign for Fusion序列):
实现这一目标的最佳方法是什么(如果图书馆确实支持它)?我特别想避免从头开始创建Fusion序列,因为我想使用Fusion操作返回的任何序列。继承+特化tag_of
返回包装序列的标签是否有效?还是我需要定义自己的标签并实现所有必需的功能来转发呼叫?
c++ - 迭代 Boost fusion::vector
我正在尝试使用以下方法迭代 boost::fusion 向量:
distance cout 语句给了我一个有限的长度 (2),但是循环似乎无限期地运行。
非常感谢任何建议!