问题标签 [template-aliases]
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++ - 具有默认值的模板别名
信息
我正在尝试使用模板别名来提高代码的可读性。理想情况下,我希望别名有一个默认参数,这样如果我省略了模板,它就会使用默认值(完全使用模板函数和模板类)。
代码看起来像
编译器(在这种情况下为 g++ 4.7)对在别名定义中包含的非常满意,= double
但它似乎忽略了这一点。
我也尝试了类似“专门化”别名的方法,但编译器在那里犹豫不决。
问题
如果我们不允许使用它,为什么编译器会接受定义中的默认值?其次,有没有办法实现这一点?
动机
这个例子非常简单,但在我的真实代码中,别名会节省大量输入(模板参数不止一个)
c++ - 具有部分模板专业化的 g++ 错误
我正在为 g++(版本 4.8.1_1,Macports)和 clang++(版本 3.3,Macports)编写一些 TMP 繁重的代码。虽然 g++ 使用UNBRIDLED FURY拒绝以下代码列表,但 clang++ 以优雅和辉煌的方式编译它。
- 哪个编译器是正确的?(我强烈怀疑它是 g++,但我想在提交错误报告之前从其他人那里得到一些保证。)
- 您有什么简单或优雅的解决方法可以建议吗?(我需要使用模板别名,因此不能切换到导致 g++ 接受代码的结构。)
这是专为您制作的代码清单。
这是 g++ 的输出:
这是 clang++ 的输出:
谢谢你的帮助!
c++ - 专门化模板别名的最佳方法(或解决方法)
我目前正在实现一个基于元编程的小型编译时计算库。
如果已经为运算符定义了一个基类,它有一个结果 typedef(我决定使用整数包装器,例如std::integral_constant
作为值而不是原始整数值,以提供沿库的统一接口)和一个 n 元运算符基类,检查运算符是否至少有一个操作数:
所以我为一元和二元运算符定义了别名:
该运算符接口用于将自定义运算符定义为别名,例如下面的比较运算符:
现在假设我们想为我们自己的类实现我们的自定义相等运算符。例如:
如果相等运算符是在继承时创建的,而不是别名,则可以通过模板特化轻松完成:
我知道模板别名不能专门化。
我的问题是:有没有办法不使用继承设计而不是模板别名来专门化这种模板别名?
c++ - Partial template binding, create new template as type
Is there some way to partially bind a template to parameter types? For example, I have the following template:
And I have another template which takes a template class as a parameter, expecting to be able to create instances of it with the first type:
This would accept a simple template like template<typename T>
without changes. What I want to do now is partially bind the generic
template, specifying only Q
and passing it to wrapper
. Making up some syntax, perhaps something like this:
I know I can almost get what I want using inheritance:
I am hoping though to avoid this though as it causes issues with constructors and operators defined in the base class.
c++ - 嵌套模板的模板模板别名?
模板别名在简化类型时非常方便,例如typename F <T>::type
just F <T>
、 whereT
和type
are 类型。
我想对模板做同样的事情,即将F <T>::map
它们简化为F <T>
、 whereT
和map
是模板结构或别名。
例如,考虑以下定义:
现在以下工作:
这会更方便,但它失败了:
neg = neg_f <F>::template map
(即使map
被定义为结构,它也会失败)。看来neg
上面的定义宁愿像“模板模板别名”
但显然没有这样的事情。
那么,有什么解决方案还是我应该留下来neg_f <pred>::map
?
c++ - C++11模板别名作为模板模板参数导致不同的类型?
我们在以下源代码的编译中观察到了一个奇怪的行为:
这是取自模板别名的 c++11 标准提案的一个稍作修改的示例:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (参见第 4 页) 另请注意,该提案“将 y 和 z 声明为同一类型”。因此,在我们的解释中,应该可以从 y 分配(或复制构造)z。
但是,此代码不能使用 gcc 4.8.1 和 clang 3.3 编译。这是编译器中的错误还是我们误解了标准?
在此先感谢 craffael 等人 ;)
PS Clang 错误消息是:
c++ - 模板类型定义的新“使用”语法解决了什么问题?
在 C++11 中,您可以通过执行类似的操作来创建“类型别名”
但这与您期望的模板 typedef 的外观有所不同:
所以这就提出了一个问题——为什么他们需要提出一种新的语法?是什么不适用于旧typedef
语法?
我意识到最后一点不能编译,但为什么不能编译?
c++ - 不推荐使用模板别名(类型别名,使用)的模板化类名?
我想重命名一个模板类。为了使用户的过渡更容易,我想将旧类保留为另一个版本,并使用 GCC / Clang 的扩展将其标记为已弃用(不推荐使用属性)。为了避免保留已弃用类的精确副本,使用模板别名会很方便。不幸的是,它似乎不起作用。这是我在 Clang 3.3、GCC 4.7 和 GCC 4.8 中尝试过的:
我错过了什么还是编译器不支持它?是否有其他想法可以在不复制整个班级的情况下获得弃用警告?
c++ - 可变模板别名作为模板参数
首先是一些代码,然后是一些上下文,然后是问题:
clang 3.3 和 gcc 4.8.1 都编译它而没有错误,将标识元函数应用于int
,因此两个表达式都计算为默认值int
(零)。
id
有一段template <typename>
时间的事实,apply1
首先apply2
让template <typename...>
我感到担忧。然而,这个例子很方便,因为否则像apply1
,这样的元函数apply2
将不得不涉及更多。
另一方面,这样的模板别名会导致我无法在此处重现的实际代码中的严重问题:gcc 的内部编译器错误频繁,clang 的意外行为较少(仅在更高级的 SFINAE 测试中)。
经过几个月的反复试验,我现在在(实验性)gcc 4.9.0 上安装并尝试了代码,出现了错误:
好的,所以这段代码似乎一直无效,但是 gcc 以各种方式崩溃而不是报告错误。有趣的是,虽然apply1
,apply2
似乎是等价的,但仅报告错误apply2
(这在实践中更有用)。至于clang,我真的不能说。
在实践中,我似乎别无他法,只能使用 gcc 4.9.0 并更正代码,即使它会变得更加复杂。
理论上,我想知道标准是怎么说的:这段代码有效吗?如果不是,是否也使用apply1
无效?还是只有apply2
?
编辑
只是为了澄清到目前为止我遇到的所有问题都是指模板别名,而不是模板结构。例如,考虑以下修改:
0
这在 clang 3.3、gcc 4.8.1、gcc 4.9.0 上都可以很好地编译和打印。
在大多数情况下,我的解决方法是在别名之前引入一个中间模板结构。但是,我现在尝试使用元函数来参数化通用 SFINAE 测试,在这种情况下,我必须直接使用别名,因为不应该实例化结构。只是想了解一下,这里有一段实际代码。
c++ - 可变模板别名作为模板参数(第 2 部分)
这是另一个问题的后续。它指的是同一个问题(我希望),但使用了一个完全不同的例子来说明它。原因是在前面的示例中,只有实验性 GCC 4.9 因编译器错误而失败。在此示例中,Clang 和 GCC 4.8.1 也以不同的方式失败:Clang 产生了意外结果,而 GCC 4.8.1 报告了不同的错误消息。
上一个问题的答案或多或少说代码是有效的,问题出在 GCC 的实验版本上。但这个结果让我更加怀疑。几个月来,我一直被我怀疑相关(或相同)的问题所困扰,这是我第一次有一个小的具体例子来说明。
所以,这里有一些代码。首先,一些通用代码将 SFINAE 应用于由可变参数模板别名元函数指定的任意测试F
:
其次,一个特定的测试,检查给定的类是否定义了一个名为的类型type
:
最后,举个例子:
预期的结果是0, 1
。叮当说0, 0
。GCC 4.8.1 说
和 GCC 4.9 说
(行号可能会有所不同)。所以,一切都失败了,以不同的方式。
现在,这里有一个解决方法。元函数car
从给定包中选择第一种类型,然后将测试重新定义为type_of2
,现在是可变参数:
现在所有三个编译器都0, 1
按预期说。有趣的是,对于任何版本的 GCC,我们都必须删除has_type
(即使我们不使用它)并且只留下has_type2
; 否则我们有类似的错误。
总结一下:我看到了一个模板的问题,它期望表单的可变参数模板参数
我们实际上将表单的非可变模板别名作为输入
最后F
像可变参数一样调用:
到目前为止的意见说这是有效的,但现在似乎三个编译器不同意。所以问题又来了:它有效吗?
对我来说这很重要,因为我有几十个现有代码文件,假设这是有效的,现在我无论如何都需要重新设计(因为这些编译器存在实际问题),但确切的重新设计将取决于答案。