问题标签 [boost-mp11]

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 回答
177 浏览

c++ - 未能尝试定义 Boost::mp11::find_if 谓词

我一直在编写一些基于策略/特征的设计,但遇到了一个我不理解的 Boost::mp11 问题。我已将问题简化为以下示例:

您可以(尝试)在此处运行代码。编译器抱怨boost::mp11::find_if类型:

这些错误都没有意义,参数 2一个类型并且 trait_name_predicate<TraitName>::result 一个类模板!

编译器和我互相混淆 - 谁能看到我做错了什么?

0 投票
2 回答
165 浏览

c++ - 在 Boost.Mp11 中苦苦挣扎:“期望一个类模板,得到 'T'”

我正在尝试使用 Boost.Mp11 检查组特殊类型的非特殊唯一性:

您可以在Coliru上运行上述代码。对于每种类型,整个列表都会被迭代,试图找到一个非专业化的等价物,所以{std::vector<int>, std::deque<float>, std::tuple<Foo>}会通过但{std::vector<int>, std::vector<float>, std::tuple<Foo>}不会。

但是我收到此错误:

但我不明白如何T未知 - 谁能看到我做错了什么?

0 投票
1 回答
111 浏览

c++ - Unnest Boost Mp11 列表

使用 Boost Mp11,我可以创建一个嵌套mp_list

如果我没记错的话,这给出了类似的东西

现在我想消除嵌套来给出类似的东西

不幸的是,我无法弄清楚如何实现这一目标。

0 投票
2 回答
107 浏览

c++ - 使用自动推导出的 lambda 参数作为常量表达式

在 C++ 中,我正在尝试编写类似于 boost-mp11 的东西mp_for_each。但是,虽然mp_for_each总是为T给定中的每个调用提供的函数mp_list<Ts...>,但我试图提出一个解决方案,一旦对函数的运行时调用false在 if 语句中产生评估为的值,就停止遍历。

查看实现mp_for_each和使用示例:

在 GitHub 上实现

Boost 参考手册中的使用示例

显然, 的实现mp_for_each设法将函数参数作为常量表达式传递,从而使用户能够在需要常量表达式的地方应用它。虽然我采用了一种结合模板尾递归的不同方法,但我希望函数参数也可以作为常量表达式传递。然而,GCC 抱怨它“不是一个常量表达式”。

我的代码如下所示:

使用 g++ 7.4.0 编译时,遇到以下错误(按我的口味格式化):

为什么counter在我的代码中不被视为常量表达式?在这方面,mp11 的代码和我的代码之间的关键区别是什么?

0 投票
1 回答
44 浏览

c++ - 为什么这个 boost mp11 mp_count_if_q 代码总是返回 0?

我想知道为什么以下代码不能按预期工作(is_numeric 始终为 0)。

我的假设是,在尝试编译东西时我犯了一些愚蠢的错误(我使用 _q 版本只是因为我无法让 mp_count_if 工作),但我没有看到任何明显的东西,并且从我发现的测试/文档中不包含某些东西类似于我相对复杂的示例。

FWIW 绑定前端似乎可以正常工作,因为我期望它可以工作......

0 投票
1 回答
73 浏览

c++ - boost mp11中“引用的元函数”的目的是什么?

我正在尝试学习 boost::mp11 的基础知识,文档还可以,但我不明白的一件事是:引用的元函数的目的是什么?文档这样说:

引用的元函数是具有称为 fn 的公共元函数成员的类,例如

算法具有后缀 _q 的“重载”,将引用的元函数作为参数,但我仍然不明白何时使用 bla 以及何时使用 bla_q。

0 投票
1 回答
97 浏览

c++ - 模板元编程 - 尝试实现维度分析

为了更好地理解和学习,我尝试使用 boost mp11 库来实现《C++ 模板元编程》一书中的维度分析(也可以在 boost mpl 库的文档中找到)。一个原因是 C++11 具有在编写本书时不可用的功能,这些功能现在非常有用。

我正在使用 Visual Studio 2019 社区版。

一切都很顺利,直到我不得不实现 operator*。我无法执行用于 mpl 库的技巧。Operator+ 运行良好,所以问题必须与书中指出的问题相似,但应该有不同的解决方案。请帮我找到它。

(最短的)示例代码如下。它被编译并正确运行。当最后 3 行未注释时,会出现错误:

错误 C2676: 二进制 '*': 'quantity<double,mass>' 未定义此运算符或转换为预定义运算符可接受的类型

由于某种原因, operator* 是不可见的,而类似的 operator+ 是。

谢谢

0 投票
1 回答
206 浏览

c++ - 使用 boost mp11 有效地打开运行时值(处理功能完成时中断)

我有以下代码,我在运行时值上实现调度以以某种方式解释数据(在这个玩具示例中,数据可以是 uint8_t 或短)。

代码似乎可以工作,但我想知道是否可以以某种方式对代码进行微优化,以便当我遇到命中(处理函数匹配)时停止处理(当前即使元组的第一个元素是“处理程序”,整个元组也会在运行)。

笔记:

  • 我不能/想要使用 std::variant。
  • 我不想使用 std::map 或 std::unordered map(其中值为std::function)
  • 我知道这是过早的优化(假设处理程序做了大量的工作,即使 10 个整数比较也很便宜)。
  • 我的处理程序是独一无二的,即它是 std::map 之类的东西,而不是 std::multimap 之类的东西,所以可以break;.
  • 用于运行时值的 id 类型不保证具有 [0, n-1] 中的值。
  • 只要在至少 1 个编译器中实现 C++20 解决方案,我就可以接受。
0 投票
1 回答
102 浏览

c++ - 使用附加函数参数提升 mp11 mp_for_each

我正在尝试将构造自的类型对列表传递boost::mp11::mp_product给一个函数,该函数将这些对与一个附加函数参数通过boost::mp11::mp_for_each.

我找到的文档mp_for_each仅限于与通用 lambda 或纯函数一起使用,所以我似乎无法弄清楚使用 是否std::bind是要走的路;如果是,我做错了什么会产生以下编译器错误:

我正在使用的代码:

0 投票
1 回答
98 浏览

c++ - boost::mp11::mp_list 无法基于 boost::msm 为 FSM 定义正确的转换表,缺少什么?

在用?构造的状态机中,是否boost::mp11::mp_list可以用作转换列表boost::mpl::vectorboost::msm

我刚刚尝试过(链接),似乎:

  1. 它编译
  2. 但它不起作用 - 缺少转换表
  3. 并产生与 相比 1/3 的代码boost::mpl::vector

我也试过boost::fusion::vector了,它有效。

我做了什么:

我简化了这个例子boost::msm————只是为了有 2 个状态和 2 个转换。

我将所有替换mpl::vectorTypeList定义为:

状态机如下:

对于这个简单的场景:

基于boost::mpl::vector(and boost::fusion::vectorand boost::mpl::list) 的示例按预期生成输出:

在使用boost::mp11::mp_list输出时:

您是否知道缺少什么boost::mp11或目前无法boost::mp11::mp_list用作boost::msm状态的转换表?