问题标签 [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 投票
1 回答
1018 浏览

c++ - 使用 mpl::if_ 和整数模板参数选择类型

以下代码适用于 Visual Studio 2005,但在使用 g++ 4.4.5 编译时出现编译器错误:

这是我得到的错误:

代码有什么问题?如果我用硬编码数字替换模板化的 X,则代码编译得很好。我也尝试用 mpl::int_ 类型包装 X 但没有任何成功。

谢谢!

0 投票
1 回答
1549 浏览

c++ - C++ Boost::MPL 折叠示例 - 参数数量错误

我想通过使用 boost::mpl::fold 来处理一些模板参数。目前,我仍然坚持使用 Boost 提供的示例,因为即使这对我也不起作用。我收到以下错误:

以下代码取自http://www.boost.org/doc/libs/1_48_0/libs/mpl/doc/refmanual/fold.html

我正在使用标志“-std=c++11”运行 mingw 4.7.0。我在网上找到了一些其他示例,但尚未成功编译任何有用的东西。有什么建议么?

0 投票
2 回答
806 浏览

c++ - 二进制谓词应该如何传递给用户定义的 Boost.MPL 算法?

考虑以下对 Boost.MPL 风格的元编程版本的尝试std::any_of

这将打印出:1 1 1 1 1 1 1 0。即,作为谓词传递的最终调用all_ofwith生成 false。std::is_base_of为什么这不起作用?显然,基类B没有正确绑定到谓词。我应该如何传递二元谓词?mpl::lambda 或 mpl::bind 的某种组合?

更新

基于 Luc Touraille 的出色回答,这里是我的问题的无 lambda 解决方案,另外还有编译时版本none_ofany_of

0 投票
1 回答
2507 浏览

c++ - 生成巨大的 Boost.MPL 类型序列

考虑以下自动生成 Boost.MPL 类型序列(列表或向量)的代码。

根据 Boost.MPL 文档,一个boost::mpl::list序列最多可以有多个BOOST_MPL_LIMIT_LIST_SIZE元素,类似地,boost::mpl::vector编译器最多可以包含BOOST_MPL_LIMIT_VECTOR_SIZE. 在我的系统上,这两个宏都评估为 20。

MSVC++ 2010 和 Boost 1.47.0 确实不能生成超过记录的 20 个元素的向量。然而,令人惊讶的是,它可以生成包含多达 247 个元素的列表!

有谁知道为什么会这样?

0 投票
1 回答
506 浏览

c++ - 编译时间常数的优化

我正在尝试实现一个像 std::pair 这样的类,但有两个以上的组件。由于在我的应用程序中可能会发生一些元组组件在编译时已经知道,我希望进行以下空间优化:当我知道一个组件是编译时常量时,只需将其声明为 ' static const' 成员,因此它不会浪费单个类实例中的存储空间。const 限定符确保任何在运行时修改值的尝试都将导致编译错误,至少如果我们排除不礼貌的 const_cast(s)。

我最终得到了以下实现,一个 ntuple 类

和一个用于标记编译时常量的类

和一堆 ntuple 类的部分特化

这样,标记为 constant<.,.> 的成员不会存储为类成员,从而减小了对象大小。所需的部分专业化数量可能很大,N=1,2,3,4 时需要 2^N,我只报告最多 N=2:我编写了一个简单的脚本来生成所有这些。该类可以按如下方式使用

像这样,这个类完美地工作。现在,我只想改进 ntuples 的声明语法如下

代替

其中 int_ 和 bool_ 可以定义为

或者我可以只使用 boost::mpl 类似物,这不是重点。为了实现这一点,简单的解决方案是编写另一个脚本并为常量和非常量模板参数的所有排列生成所有可能的特化,其中常量模板参数可以是 int_、bool_、char_ 等。这是可行的,但代价是部分专业化数量的阶乘增加。我正在考虑将 ntuple 类的定义更改如下

并专门化 ntuple 如下

等等。这会将部分特化的数量减少到与以前相同的数量,并且只需要为每个有效的“常量”类型特化特征类。问题是,我想避免额外的模板参数。我可以通过继承来做到这一点,定义一个辅助类

像上面那样专门化,然后

但我想避免继承,因为在某些情况下生成的对象会比必要的大,因为它将包含 ntuple_impl 作为子对象。我想知道这个问题是否有另一种解决方案。谢谢。朱利亚诺

0 投票
2 回答
1153 浏览

c++ - 带有可变参数模板的类 MPL 向量:插入

我想知道如何使用可变参数模板编写类似Boost MPL的 vector_c 。我已经编写了以下代码片段:

您可能会注意到其中vector必须至少包含一个元素,但这对我来说并不是真正的限制。使用上面的定义,很容易编写“函数”来访问给定索引的元素:

例如,get<1, vector<1, 2, 3>>返回正确的结果2。现在我的问题是:如何实现插入功能?我不使用 MPL 的原因是当我尝试它时insert<>,它没有返回一个vector_c. 特别是,应该像这样应用插入:

必须屈服vector<1, 2, 3, 4>。_ 这可能吗?

0 投票
1 回答
1176 浏览

c++ - 使用 boost::mpl::vector 创建可变参数模板?

我现在坚持使用 C++03,我想创建一个接受任意数量的类型安全参数的全局函数(如果需要,可以达到合理的限制,比如 9)。

我可以访问我的代码库中的完整 boost 库,所以我希望boost::mpl::vector在这里有用。我也不希望这样写起来太不方便。调用站点的语法应该很简单,如下所示:

以类型安全的方式实现这一点的最佳方法是什么?

编辑

我也意识到我可以为此使用模板专业化,但我不想最终定义相同的结构 9 次,每个额外的模板参数一个。这太乱了。如果可能的话,我想避免这种情况。

0 投票
1 回答
1095 浏览

c++ - 为什么 boost mpl set 允许非唯一类型

我相信我对boost::mpl::set的理解从根本上是有缺陷的。我认为它只允许独特的类型。

但是下面的代码编译:

0 投票
0 回答
696 浏览

c++ - 时间:2019-05-10 标签:c++boostmpl/fusionvectorsdynamicpush_back

我是 TMP 世界的新手,我需要一些关于在 boost mpl 或融合中使用向量的帮助。

所以情况如下:

我在多线程环境中有一个用于异步函数调用的 API,它被实现为运行时库,例如:async_call(function_ptr, arg1, arg2, ... argN); 函数具有可变数量的参数。

所以应用程序的代码如下所示:

该库将参数值存储在一些内部数据结构中,并在未来某个时间执行由库确定的函数。为了实现一些优化,我需要知道特定应用程序的所有可能不同数量的参数并填充包含参数数量的 const 数组:因此在编译期间需要填充类似的内容:

我已经将 async_call 实现为可变参数模板函数,并且在内部我使用一些模板元编程计算每个提交函数的参数数量(count_args<...>

问题来了:我可以用 count_args<...> 结果填充全局 MPL 或 FUSION 向量,然后将其转换为 const 数组吗?

我已经看到一些代码建议使用 boost 预处理器从 MPL 向量生成 const 数组,如下所示:

所以我在全局声明了一个 mpl 向量:

并尝试从 async_call 函数(从 main 调用)中 push_back,如下所示:

然而,向量没有得到更新,因为我必须以某种方式用 push_back 返回的新序列“更新”argsTable!我可以这样做吗?MPL 足够还是我需要融合?

任何其他解决方案的建议都非常受欢迎!

0 投票
1 回答
842 浏览

c++ - C++ 编译时条件运行时语句

有没有办法在编译时决定两个运行时代码路径之一?我知道可以使用函数重载来完成这一壮举,但随后代码大小会增加,因为我的两个函数都被编译并链接到程序中。有没有办法避免这种大小的开销?

本质上,我想做的是:

我知道的唯一方法涉及重载成员函数:

但是现在,两个make_copy成员函数被编译并链接到程序中,尽管X可能只使用抽象类模板参数实例化,在这种情况下,只需要其中一个。