问题标签 [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 回答
240 浏览

compiler-construction - C++0x TMP 编译速度

这个问题的重点是模板元编程结构。我发现了两篇文章(一篇两篇,然而两篇没有提供确凿的证据,但我相信这些说法)提供的证据表明 c++0x 原型编译器将指数编译时间转变为线性编译时间。

我有一个模糊的想法,即 auto、decltype 和 variadic 模板将有一些东西是这方面的推动力。我希望看到的是对语言变化和实现这一点的编译器技术的彻底解释,特别是解释如何和为什么。

在我的技能水平上,我在愤怒中使用了boost TMP库精神,以及一些玩具MPL程序。

0 投票
5 回答
72842 浏览

c++ - 向量在 C++ 中的实现

我最近写了一个 STL Vector 的实现作为编程练习。该程序编译但我收到一个奇怪的错误说:

我以前从来没有遇到过这个错误,我不确定在我的实现中究竟应该改变什么以使其正常运行。

有人可以看一下我的代码,看看在这种特定情况下是否有任何错误之处?对不起,我不能更具体,我不知道自己在哪里看,在此先感谢。

0 投票
3 回答
1284 浏览

c++ - 在 C++0x 中创建静态类型的变体

我想知道,是否可以在 C++0x 中创建一个静态类型的变体(其行为类似于自动):

当我们将 v 分配给 int 以外的值时,它不会编译:

到目前为止,我还没有找到任何优雅的解决方案。

0 投票
2 回答
3523 浏览

c++ - 是否可以在 C++ 中循环遍历抽象类的所有子类?

我在 C++ 中有一个带有几个子类的抽象类。

是否可以通过宏或模板元编程以某种方式执行以下操作:

0 投票
1 回答
699 浏览

c++ - 具有模板类型的模板化模板参数列表

C++ 允许这样的模板化模板参数:

Bool类型可以用typedef替换(因此不需要原始类型名称出现在声明中):

这完美地工作,但如果我尝试定义这样的嵌套结构

那么下面的代码编译失败:

这是符合标准的行为,还是我做错了什么?我正在使用 MSVS 2008。

编辑:
我在 Microsoft 支持论坛上发布了错误报告: 错误报告

0 投票
5 回答
186 浏览

c++ - 替换这个宏

鉴于此宏

我想替换它,以便它取而代之的是一个数组 [4]。这样我就可以写 MAKE_TYPE("ABCD") 而不是丑陋的 MAKE_TYPE('A', 'B', 'C', 'D')

我在编译时使用它来生成一些常量。

但是,它不喜欢我传递这样的字符串

错误:数组引用不能出现在常量表达式中

好吧,那没有用。所以我想我会使用模板元编程来破解它

不幸的是,这也没有奏效。我似乎无法在模板中添加 char[4]。我得到这些错误:

错误:“s”之前的预期“>”错误:“s”未在此范围内声明错误:数组引用不能出现在常量表达式中

我该怎么做?

0 投票
1 回答
1419 浏览

c++ - C++0x 嵌套初始化列表

我想使用 C++0x 新的初始化程序列表功能来初始化 std::vector ,并为我目前正在处理的新 API 使用编译时定义的项目数。像这样的东西:

你知道如何做到这一点吗?甚至可能吗?我知道我需要使用 TMP 和递归来建立重复字符串的列表,并最终通过常量(例如,枚举)以某种方式访问​​它。但似乎我什至不能像这样嵌套初始化列表。

0 投票
6 回答
6746 浏览

c++ - C++编译时函数执行

我的代码中有字符串标签,这些标签被转换为数字并用于在标签值结构中搜索值。

我有这样的事情:

搜索定义如下:

因为所有时间标签在编译时都是恒定的,所以我想从搜索函数中删除将标签转换为数字的调用。我知道可以在编译时使用模板(http://en.wikipedia.org/wiki/Compile_time_function_execution)执行一些简单的函数,但我不知道如何遍历一个空终止的字符串并保留中间值在模板中。你能给出一个简单的例子来迭代一个空终止的字符串并将字符添加到一个公共变量中吗?

0 投票
2 回答
823 浏览

c++ - Boost MPL 模板列表

我想获取一个类模板列表T 1 , T 2 , ... T N并列出一个 MPL 类列表,其中每个模板都使用相同的参数进行实例化。

boost::mpl::list不能与模板模板参数列表一起使用,只能与常规类型参数一起使用。

所以以下不起作用:

我怎样才能让它工作?

0 投票
3 回答
1686 浏览

c++ - 将类模板实例化与其基类模板进行比较时,is_same 返回 false 吗?

*编辑:不知何故,我认为编译器正在创建Bas A<int, int, string>,这导致我假设 is_same 应该如何评估它们,而不管继承/派生如何。我的错 :( 抱歉后来的误解 :\ *

制作一些元函数来检查我的自定义类型,并遇到了这个问题,但不确定我是否理解这里发生了什么。我想我可以通过将已知类型的 this_t 成员与传递的任何参数的 this_t 进行比较来解决它,但我只想了解为什么第一个和第三个 is_same 测试失败:

is_same 是否通过A<...>基础进行区分?A<int, int, string>和之间有什么明显区别B