问题标签 [template-meta-programming]

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

c++ - 本身就是模板的专业化

我有一个模板类,我有一些专长。
但下一个专业化是模板本身。你如何指定这个:

0 投票
5 回答
2455 浏览

c++ - 为什么 type_traits 使用专门的模板结构而不是 constexpr 来实现?

标准是否有任何理由将它们指定为 templatestruct而不是简单的 boolean constexpr

在另一个问题中,可能会在主要问题的一个很好的答案中得到回答,一个人将如何enable_if处理非结构版本的东西?

0 投票
6 回答
1703 浏览

c++ - 如何确定一个类型是否可以仅使用 const 引用来调用?

我想编写一个is_callable<F, Arg>定义value为的 C++ 元函数true,当且仅当类型 F 具有形式的函数调用运算符时SomeReturnType operator()(const Arg &)。例如,在以下情况下

我想is_callable<foo, int &>成为falseis_callable<foo, const int &>成为true。这是我到目前为止所拥有的:

这打印1and 1,但我想要0and1因为foo只定义void operator()(const int &).

0 投票
2 回答
348 浏览

c++ - 收集稍后应在宏中调用的函数列表

我正在编写一个小型库,使用它 C++ 中的枚举应该变得更容易。语法类似于:

此宏创建一个 MyEnum 类,例如允许以下访问:

以及更多功能,例如将附加数据(例如字符串)存储到枚举值。

宏已经完成并且可以工作,但并不像上面显示的那样容易定义。为此,我需要一种方法来创建带有 ENUM_VAL 宏的初始化函数列表,以便稍后调用。类似于以下 boost::mpl 方法:

这样 list##(__COUNTER__-1) 最终包含类型 Init##Name ,我最终可以使用 mpl foreach 对所有存储类型调用 init() 。

现在的问题是命名。每个宏实例化我必须使用 __COUNTER__ 两次,这会使计数器增加两次。我已经搜索并发现

  • 命名变量时,C 预处理器不计算 (__COUNTER__-1)
  • 如果不增加它,就无法读取 __COUNTER__ 。

所以我需要另一种方法来收集我以后可以调用的函数列表。

0 投票
1 回答
604 浏览

c++ - 使用模板元编程执行重载解决方案

受到另一个问题的启发,我试图找到一种方法来推断给定用于调用该函数的实际参数的重载成员函数的类型。这是我到目前为止所拥有的:

只要模板参数 Arg 与实际类型匹配,static_cast 就会成功,但这只是重载解析(精确匹配)最简单的情况。是否可以在模板元编程中执行完整的重载解决过程?

这纯粹是假设性的,不适合实际使用。

0 投票
2 回答
416 浏览

c++ - 阶乘的意思在模板定义中

我很难理解以下模板定义和模板专业化定义是如何工作的?对我来说,factorial<34>还是factorial<T-1>看起来怪怪的!

例如:

意味着什么?

0 投票
2 回答
1753 浏览

c++ - 这个 has_member 类模板是如何工作的?

我试图了解以下类模板的工作原理(取自此处),但我无法正确理解:

更具体地说,我不明白其中的目的BaseMixin和存在operator()。另外,既然Base是从它派生的,我也不明白。

更具体地说,当模板参数Type已定义时operator(),为什么只有SFINAE 被触发,导致第一个deduce()函数被忽略而选择第二个函数?


无论如何,这是我的测试代码:

输出(ideone):

0 投票
2 回答
3047 浏览

c++ - C++11 可变参数模板模板参数

保留旧问题。解决方法见下文。这可能很简单,但仍然如此。我有以下 C++11 代码片段:

如何EventStorage使用. EventContainer_ typelist我可以使用 Loki:: library 来完成,但我想将 C++11 与可变参数模板一起使用。谢谢你。

解决方案 1:修复EventStorage模板模板问题。这将使EventStorage多个继承所有EventContainer模板化的每个类型的Ts.

现在我有编译时错误,如下main()

为什么编译器会感到困惑?毕竟我用特定的类型推送。GCC 4.6.1 在这里。

解决方案2:正如@Matthieu M. 建议的那样,我可以提出一个转发方法 int EventStorage,但代价是一个额外的函数调用:

根据 Alexandrescu 的说法,只要参数是引用,编译器就会优化这个前向调用。现在问题正式结束:)

0 投票
1 回答
350 浏览

c++ - 从融合向量的标准向量返回列,不复制

我有一个由 a 表示的“表格”,std::vector其中每个元素都是 a boost::fusion::vector。我需要将此表的“列”的表示形式返回为 a std::vector,而不复制任何值。这样做的最佳方法是什么?我正在尝试构建一个std::vectornviews ,其中 n 是列号,但它似乎不起作用。我是在正确的轨道上还是有其他方法可以解决这个问题?

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