问题标签 [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.

0 投票
6 回答
1138 浏览

c++ - 松耦合隐式转换

当类型在语义上等价时,隐式转换非常有用。例如,假设两个库实现了相同的类型,但在不同的命名空间中。或者只是一种几乎相同的类型,除了一些语义糖在这里和那里。现在,您不能将一种类型传递给旨在使用另一种类型的函数(在其中一个库中),除非该函数是模板。如果不是,您必须以某种方式将一种类型转换为另一种类型。这应该是微不足道的(否则类型毕竟不是那么相同!)但是显式调用转换会使您的代码膨胀,其中大部分是无意义的函数调用。虽然这样的转换函数实际上可能会复制一些值,但从高级“程序员”的角度来看,它们基本上什么都不做。

隐式转换构造函数和运算符显然会有所帮助,但它们会引入耦合,因此其中一种类型必须了解另一种类型。通常,至少在处理库时,情况并非如此,因为其中一种类型的存在使另一种变得多余。此外,您不能总是更改库。

现在我看到了两个关于如何在用户代码中进行隐式转换的选项:

  1. 第一个是提供一个代理类型,它为所有涉及的类型实现转换运算符和转换构造函数(和分配),并始终使用它。

  2. 第二个需要对库进行最小的更改,但具有很大的灵活性:为每个涉及的类型添加一个转换构造函数,可以选择在外部启用。

例如,为一个类型A添加一个构造函数:

和一个模板

默认情况下禁用隐式转换。

然后要启用两种类型之间的转换,请专门化模板:

并实现一个convert可以通过ADL找到的功能。

我个人更喜欢使用第二种变体,除非有强烈的反对意见。

现在到实际问题:为隐式转换关联类型的首选方法是什么?我的建议是好主意吗?这两种方法都有缺点吗?允许这样的转换危险吗?当他们的类型很可能在他们最有可能使用的软件中被复制时,库实现者一般是否应该提供第二种方法(我在这里考虑 3d 渲染中间件,其中大多数包都实现了 3D向量)。

0 投票
2 回答
2481 浏览

c++ - 有没有办法摆脱 boost::mpl for_each?

真的很简单的问题,让我提供一些背景:

我有一种mpl::vector类型,其中每种类型都有一个 id,在运行时我使用mpl::for_each迭代这个向量并找到给定 id 的匹配类型。但是一旦找到,继续循环就没有意义了,所以 - 问题是,有没有办法摆脱它(不抛出异常)?

0 投票
3 回答
4302 浏览

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 的测试并没有引导我到任何地方)。
0 投票
2 回答
1149 浏览

c++ - 将 MPL 向量转换为静态数组

我编写了一些代码来生成一个boost::mpl::vector用作阶乘函数的查找表的代码,作为对更通用库函数的测试,开发人员可以使用该库函数以静态基元数组的形式生成查找表。该函数(很可能作为预处理器宏定义实现)将接受要初始化的数组的名称和大小,以及用作初始化数组每个元素i的元函数的类模板的名称.

我认为在不使用外部脚本的情况下执行此操作的最佳方法是

  1. 创建一个boost::mpl::vector,如下面的代码清单中所做的那样,并将数组每个元素的用户提供的元函数的返回值推送到向量的后面;
  2. 使用向量的元素初始化静态数组(也许通过使用一系列宏,其中最后一个将使用__VARARGS__宏来完成此操作)。

我既不知道我将如何完成(2),也不知道我所描述的程序是否是做我所寻求的好方法。以下是我想要回答的以下问题:

  1. 我的程序是完成我所寻求的好方法吗?如果不是,请描述一个更好的程序,它可以在不使用外部脚本的情况下完成同样的事情。

  2. 如果我的程序确实是实现我所寻求的好方法,我将如何实施(2)?

    我一定会发布一个包含库函数的源文件的链接,一旦我实现它,我就会描述它。代码清单如下。

    命名空间 mpl = boost::mpl;

0 投票
1 回答
236 浏览

c++ - 组合一组容器类并从基础访问它们

我正在尝试使用boost::mpl::inherit_linearly用户提供的类型来组成容器类:

我得到的编译错误是:

不应该Base是由 产生的任何类型的基础inherit_linearly吗?如果是这样,avector<int>和其他向量不应该出现在类型层次结构中以便 static_cast 退出吗?

有没有其他方法可以获得这个功能?

0 投票
3 回答
362 浏览

c++ - 如何使用 mpl 技术启用构造函数

我对 boost::enable_if 以及如何使用它进行构造函数切换不太了解。

代码是这样的:

我要归档的内容如下。它希望第一个 Tor 仅在给定 NullType 时可用。在所有其他情况下,我想禁用第一个 Tor 并启用第二个。

目前我收到一个编译错误,因为其中一个构造函数无效。但是我怎样才能使 Ctor 成为模板化的并重用类模板参数呢?

0 投票
1 回答
2297 浏览

c++ - Boost Fusion / MPL:将类型从序列转换为等效any_range的序列

我想使用 Boostany_range来处理多个异构数据范围。我的数据范围的类型称为融合向量,例如:

给定这样的类型,我想编写一个模板来派生这样的进一步类型:

其中AnyRange定义为:

我已经尝试过并且失败了。这甚至可以通过 Fusion 实现吗?MPL?或者,也许我正朝着错误的方向前进any_range

0 投票
3 回答
291 浏览

c++ - C++ 泛型编程的精妙之处

下面的代码说明了我遇到的问题。

错误:

我试图模拟的模式是在代码/构建级别扩展程序(很像nginx模块在编译时的连接方式)。我需要构建一个可扩展的编译时结构,通过将#includes 添加到我的构建中,它是可扩展的(可插入的),这会产生一个具有唯一名称的 boost-mpl-vector,其中包含我所有的插件。因此,如果X是唯一的结束名称,则 X_0、X_1、X_2 是在向量应用了 mpl-vector 时沿途建立的名称push_back

知道boost::preprocessor 的抽象是关键,但我还不想花时间研究它,因为我正在对系统的一部分进行原型设计,最终将在编译时模块化。

所以,为了以后的参考,

  1. 为什么我在上面收到错误?
  2. 正确的原始预处理器模式应该是什么样子。
  3. 正确的 boost-preprocessor-library 模式是什么样的。
0 投票
1 回答
1285 浏览

c++ - BOOST_MPL_ASSERT 的问题

使用 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)/ boost 1.33.1 编译良好

预处理后main()的样子:

怎么了?

0 投票
1 回答
291 浏览

c++ - MPL pos 是一个未记录的元函数吗?

该算法的BOOST MPL 文档中find有以下示例代码:

但是,我找不到迭代器pos元函数的文档。我可以可靠地使用它吗?

我想以某种方式使用它:

将类型信息与值本身一起存储到文件中。

编辑

感谢 Potatoswatter 的回答,这个解决方案似乎有效: