问题标签 [boost-mpl]
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++ - 松耦合隐式转换
当类型在语义上等价时,隐式转换非常有用。例如,假设两个库实现了相同的类型,但在不同的命名空间中。或者只是一种几乎相同的类型,除了一些语义糖在这里和那里。现在,您不能将一种类型传递给旨在使用另一种类型的函数(在其中一个库中),除非该函数是模板。如果不是,您必须以某种方式将一种类型转换为另一种类型。这应该是微不足道的(否则类型毕竟不是那么相同!)但是显式调用转换会使您的代码膨胀,其中大部分是无意义的函数调用。虽然这样的转换函数实际上可能会复制一些值,但从高级“程序员”的角度来看,它们基本上什么都不做。
隐式转换构造函数和运算符显然会有所帮助,但它们会引入耦合,因此其中一种类型必须了解另一种类型。通常,至少在处理库时,情况并非如此,因为其中一种类型的存在使另一种变得多余。此外,您不能总是更改库。
现在我看到了两个关于如何在用户代码中进行隐式转换的选项:
第一个是提供一个代理类型,它为所有涉及的类型实现转换运算符和转换构造函数(和分配),并始终使用它。
第二个需要对库进行最小的更改,但具有很大的灵活性:为每个涉及的类型添加一个转换构造函数,可以选择在外部启用。
例如,为一个类型A
添加一个构造函数:
和一个模板
默认情况下禁用隐式转换。
然后要启用两种类型之间的转换,请专门化模板:
并实现一个convert
可以通过ADL找到的功能。
我个人更喜欢使用第二种变体,除非有强烈的反对意见。
现在到实际问题:为隐式转换关联类型的首选方法是什么?我的建议是好主意吗?这两种方法都有缺点吗?允许这样的转换危险吗?当他们的类型很可能在他们最有可能使用的软件中被复制时,库实现者一般是否应该提供第二种方法(我在这里考虑 3d 渲染中间件,其中大多数包都实现了 3D向量)。
c++ - 有没有办法摆脱 boost::mpl for_each?
真的很简单的问题,让我提供一些背景:
我有一种mpl::vector
类型,其中每种类型都有一个 id,在运行时我使用mpl::for_each
迭代这个向量并找到给定 id 的匹配类型。但是一旦找到,继续循环就没有意义了,所以 - 问题是,有没有办法摆脱它(不抛出异常)?
c++ - 如何将 std::tuple 类型与 boost::mpl 算法一起使用?
这些boost::mpl
算法似乎无法处理std::tuple
开箱即用的类型,例如,以下内容无法编译(boost-1.46.0,g++ 快照 2011-02-19):
使boost::mpl
算法起作用的最简单方法是什么std::tuple
?
- 是否 evtl。
boost::fusion
提供这个功能(因为它这样做boost::tuple
)? - 如果没有,是否可以轻松地延续融合
boost::tuple
实现std::tuple
? - 如果不是,我是否真的必须实现MPL 文档中列出的所有内在元功能,或者哪些就足够了?(文档只说“许多内在元函数提供了一个默认实现,在大多数情况下都可以工作”,但不清楚究竟是哪些。一些只提供 begin 和 end 的测试并没有引导我到任何地方)。
c++ - 将 MPL 向量转换为静态数组
我编写了一些代码来生成一个boost::mpl::vector
用作阶乘函数的查找表的代码,作为对更通用库函数的测试,开发人员可以使用该库函数以静态基元数组的形式生成查找表。该函数(很可能作为预处理器宏定义实现)将接受要初始化的数组的名称和大小,以及用作初始化数组每个元素i的元函数的类模板的名称.
我认为在不使用外部脚本的情况下执行此操作的最佳方法是
- 创建一个
boost::mpl::vector
,如下面的代码清单中所做的那样,并将数组每个元素的用户提供的元函数的返回值推送到向量的后面; - 使用向量的元素初始化静态数组(也许通过使用一系列宏,其中最后一个将使用
__VARARGS__
宏来完成此操作)。
我既不知道我将如何完成(2),也不知道我所描述的程序是否是做我所寻求的好方法。以下是我想要回答的以下问题:
我的程序是完成我所寻求的好方法吗?如果不是,请描述一个更好的程序,它可以在不使用外部脚本的情况下完成同样的事情。
如果我的程序确实是实现我所寻求的好方法,我将如何实施(2)?
我一定会发布一个包含库函数的源文件的链接,一旦我实现它,我就会描述它。代码清单如下。
命名空间 mpl = boost::mpl;
c++ - 组合一组容器类并从基础访问它们
我正在尝试使用boost::mpl::inherit_linearly
用户提供的类型来组成容器类:
我得到的编译错误是:
不应该Base
是由 产生的任何类型的基础inherit_linearly
吗?如果是这样,avector<int>
和其他向量不应该出现在类型层次结构中以便 static_cast 退出吗?
有没有其他方法可以获得这个功能?
c++ - 如何使用 mpl 技术启用构造函数
我对 boost::enable_if 以及如何使用它进行构造函数切换不太了解。
代码是这样的:
我要归档的内容如下。它希望第一个 Tor 仅在给定 NullType 时可用。在所有其他情况下,我想禁用第一个 Tor 并启用第二个。
目前我收到一个编译错误,因为其中一个构造函数无效。但是我怎样才能使 Ctor 成为模板化的并重用类模板参数呢?
c++ - Boost Fusion / MPL:将类型从序列转换为等效any_range的序列
我想使用 Boostany_range
来处理多个异构数据范围。我的数据范围的类型称为融合向量,例如:
给定这样的类型,我想编写一个模板来派生这样的进一步类型:
其中AnyRange
定义为:
我已经尝试过并且失败了。这甚至可以通过 Fusion 实现吗?MPL?或者,也许我正朝着错误的方向前进any_range
。
c++ - C++ 泛型编程的精妙之处
下面的代码说明了我遇到的问题。
错误:
我试图模拟的模式是在代码/构建级别扩展程序(很像nginx模块在编译时的连接方式)。我需要构建一个可扩展的编译时结构,通过将#include
s 添加到我的构建中,它是可扩展的(可插入的),这会产生一个具有唯一名称的 boost-mpl-vector,其中包含我所有的插件。因此,如果X
是唯一的结束名称,则 X_0、X_1、X_2 是在向量应用了 mpl-vector 时沿途建立的名称push_back
。
我知道boost::preprocessor 的抽象是关键,但我还不想花时间研究它,因为我正在对系统的一部分进行原型设计,最终将在编译时模块化。
所以,为了以后的参考,
- 为什么我在上面收到错误?
- 正确的原始预处理器模式应该是什么样子。
- 正确的 boost-preprocessor-library 模式是什么样的。
c++ - BOOST_MPL_ASSERT 的问题
使用 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)/ boost 1.33.1 编译良好
预处理后main()
的样子:
怎么了?
c++ - MPL pos 是一个未记录的元函数吗?
该算法的BOOST MPL 文档中find
有以下示例代码:
但是,我找不到迭代器pos
元函数的文档。我可以可靠地使用它吗?
我想以某种方式使用它:
将类型信息与值本身一起存储到文件中。
编辑
感谢 Potatoswatter 的回答,这个解决方案似乎有效: