问题标签 [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.
c++ - 未能尝试定义 Boost::mp11::find_if 谓词
我一直在编写一些基于策略/特征的设计,但遇到了一个我不理解的 Boost::mp11 问题。我已将问题简化为以下示例:
您可以(尝试)在此处运行代码。编译器抱怨boost::mp11::find_if
类型:
这些错误都没有意义,参数 2是一个类型并且 trait_name_predicate<TraitName>::result
是一个类模板!
编译器和我互相混淆 - 谁能看到我做错了什么?
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
未知 - 谁能看到我做错了什么?
c++ - Unnest Boost Mp11 列表
使用 Boost Mp11,我可以创建一个嵌套mp_list
的
如果我没记错的话,这给出了类似的东西
现在我想消除嵌套来给出类似的东西
不幸的是,我无法弄清楚如何实现这一目标。
c++ - 使用自动推导出的 lambda 参数作为常量表达式
在 C++ 中,我正在尝试编写类似于 boost-mp11 的东西mp_for_each
。但是,虽然mp_for_each
总是为T
给定中的每个调用提供的函数mp_list<Ts...>
,但我试图提出一个解决方案,一旦对函数的运行时调用false
在 if 语句中产生评估为的值,就停止遍历。
查看实现mp_for_each
和使用示例:
显然, 的实现mp_for_each
设法将函数参数作为常量表达式传递,从而使用户能够在需要常量表达式的地方应用它。虽然我采用了一种结合模板尾递归的不同方法,但我希望函数参数也可以作为常量表达式传递。然而,GCC 抱怨它“不是一个常量表达式”。
我的代码如下所示:
使用 g++ 7.4.0 编译时,遇到以下错误(按我的口味格式化):
为什么counter
在我的代码中不被视为常量表达式?在这方面,mp11 的代码和我的代码之间的关键区别是什么?
c++ - 为什么这个 boost mp11 mp_count_if_q 代码总是返回 0?
我想知道为什么以下代码不能按预期工作(is_numeric 始终为 0)。
我的假设是,在尝试编译东西时我犯了一些愚蠢的错误(我使用 _q 版本只是因为我无法让 mp_count_if 工作),但我没有看到任何明显的东西,并且从我发现的测试/文档中不包含某些东西类似于我相对复杂的示例。
FWIW 绑定前端似乎可以正常工作,因为我期望它可以工作......
c++ - boost mp11中“引用的元函数”的目的是什么?
我正在尝试学习 boost::mp11 的基础知识,文档还可以,但我不明白的一件事是:引用的元函数的目的是什么?文档这样说:
引用的元函数是具有称为 fn 的公共元函数成员的类,例如
算法具有后缀 _q 的“重载”,将引用的元函数作为参数,但我仍然不明白何时使用 bla 以及何时使用 bla_q。
c++ - 模板元编程 - 尝试实现维度分析
为了更好地理解和学习,我尝试使用 boost mp11 库来实现《C++ 模板元编程》一书中的维度分析(也可以在 boost mpl 库的文档中找到)。一个原因是 C++11 具有在编写本书时不可用的功能,这些功能现在非常有用。
我正在使用 Visual Studio 2019 社区版。
一切都很顺利,直到我不得不实现 operator*。我无法执行用于 mpl 库的技巧。Operator+ 运行良好,所以问题必须与书中指出的问题相似,但应该有不同的解决方案。请帮我找到它。
(最短的)示例代码如下。它被编译并正确运行。当最后 3 行未注释时,会出现错误:
错误 C2676: 二进制 '*': 'quantity<double,mass>' 未定义此运算符或转换为预定义运算符可接受的类型
由于某种原因, operator* 是不可见的,而类似的 operator+ 是。
谢谢
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 解决方案,我就可以接受。
c++ - 使用附加函数参数提升 mp11 mp_for_each
我正在尝试将构造自的类型对列表传递boost::mp11::mp_product
给一个函数,该函数将这些对与一个附加函数参数通过boost::mp11::mp_for_each
.
我找到的文档mp_for_each
仅限于与通用 lambda 或纯函数一起使用,所以我似乎无法弄清楚使用 是否std::bind
是要走的路;如果是,我做错了什么会产生以下编译器错误:
我正在使用的代码:
c++ - boost::mp11::mp_list 无法基于 boost::msm 为 FSM 定义正确的转换表,缺少什么?
在用?构造的状态机中,是否boost::mp11::mp_list
可以用作转换列表boost::mpl::vector
boost::msm
我刚刚尝试过(链接),似乎:
- 它编译
- 但它不起作用 - 缺少转换表
- 并产生与 相比 1/3 的代码
boost::mpl::vector
。
我也试过boost::fusion::vector
了,它有效。
我做了什么:
我简化了这个例子boost::msm
——见——只是为了有 2 个状态和 2 个转换。
我将所有替换mpl::vector
为TypeList
定义为:
状态机如下:
对于这个简单的场景:
基于boost::mpl::vector
(and boost::fusion::vector
and boost::mpl::list
) 的示例按预期生成输出:
在使用boost::mp11::mp_list
输出时:
您是否知道缺少什么boost::mp11
或目前无法boost::mp11::mp_list
用作boost::msm
状态的转换表?