问题标签 [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.

0 投票
1 回答
1856 浏览

c++ - 具有默认值的模板别名

信息

我正在尝试使用模板别名来提高代码的可读性。理想情况下,我希望别名有一个默认参数,这样如果我省略了模板,它就会使用默认值(完全使用模板函数和模板类)。

代码看起来像

编译器(在这种情况下为 g++ 4.7)对在别名定义中包含的非常满意,= double但它似乎忽略了这一点。

我也尝试了类似“专门化”别名的方法,但编译器在那里犹豫不决。

问题

如果我们不允许使用它,为什么编译器会接受定义中的默认值?其次,有没有办法实现这一点?

动机

这个例子非常简单,但在我的真实代码中,别名会节省大量输入(模板参数不止一个)

0 投票
3 回答
551 浏览

c++ - 具有部分模板专业化的 g++ 错误

我正在为 g++(版本 4.8.1_1,Macports)和 clang++(版本 3.3,Macports)编写一些 TMP 繁重的代码。虽然 g++ 使用UNBRIDLED FURY拒绝以下代码列表,但 clang++ 以优雅辉煌的方式编译它。

  • 哪个编译器是正确的?(我强烈怀疑它是 g++,但我想在提交错误报告之前从其他人那里得到一些保证。)
  • 您有什么简单或优雅的解决方法可以建议吗?(我需要使用模板别名,因此不能切换到导致 g++ 接受代码的结构。)

这是专为您制作的代码清单。

这是 g++ 的输出:

这是 clang++ 的输出:

谢谢你的帮助!

0 投票
3 回答
3063 浏览

c++ - 专门化模板别名的最佳方法(或解决方法)

我目前正在实现一个基于元编程的小型编译时计算库。

如果已经为运算符定义了一个基类,它有一个结果 typedef(我决定使用整数包装器,例如std::integral_constant作为值而不是原始整数值,以提供沿库的统一接口)和一个 n 元运算符基类,检查运算符是否至少有一个操作数:

所以我为一元和二元运算符定义了别名:

该运算符接口用于将自定义运算符定义为别名,例如下面的比较运算符:

现在假设我们想为我们自己的类实现我们的自定义相等运算符。例如:

如果相等运算符是在继承时创建的,而不是别名,则可以通过模板特化轻松完成:

我知道模板别名不能专门化
我的问题是:有没有办法不使用继承设计而不是模板别名来专门化这种模板别名?

0 投票
1 回答
387 浏览

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.

0 投票
1 回答
1371 浏览

c++ - 嵌套模板的模板模板别名?

模板别名在简化类型时非常方便,例如typename F <T>::typejust F <T>、 whereTtypeare 类型。

我想对模板做同样的事情,即将F <T>::map它们简化为F <T>、 whereTmap是模板结构或别名。

例如,考虑以下定义:

现在以下工作:

这会更方便,但它失败了:

neg = neg_f <F>::template map(即使map被定义为结构,它也会失败)。看来neg上面的定义宁愿像“模板模板别名”

但显然没有这样的事情。

那么,有什么解决方案还是我应该留下来neg_f <pred>::map

0 投票
2 回答
655 浏览

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 错误消息是:

0 投票
4 回答
555 浏览

c++ - 模板类型定义的新“使用”语法解决了什么问题?

在 C++11 中,您可以通过执行类似的操作来创建“类型别名”

但这与您期望的模板 typedef 的外观有所不同:

所以这就提出了一个问题——为什么他们需要提出一种新的语法?是什么不适用于旧typedef语法?

我意识到最后一点不能编译,但为什么不能编译?

0 投票
1 回答
1295 浏览

c++ - 不推荐使用模板别名(类型别名,使用)的模板化类名?

我想重命名一个模板类。为了使用户的过渡更容易,我想将旧类保留为另一个版本,并使用 GCC / Clang 的扩展将其标记为已弃用(不推荐使用属性)。为了避免保留已弃用类的精确副本,使用模板别名会很方便。不幸的是,它似乎不起作用。这是我在 Clang 3.3、GCC 4.7 和 GCC 4.8 中尝试过的:

我错过了什么还是编译器不支持它?是否有其他想法可以在不复制整个班级的情况下获得弃用警告?

0 投票
1 回答
3622 浏览

c++ - 可变模板别名作为模板参数

首先是一些代码,然后是一些上下文,然后是问题:

clang 3.3 和 gcc 4.8.1 都编译它而没有错误,将标识元函数应用于int,因此两个表达式都计算为默认值int(零)。

id有一段template <typename>时间的事实,apply1首先apply2template <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 测试,在这种情况下,我必须直接使用别名,因为不应该实例化结构。只是想了解一下,这里有一段实际代码。

0 投票
2 回答
979 浏览

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像可变参数一样调用:

到目前为止的意见说这是有效的,但现在似乎三个编译器不同意。所以问题又来了:它有效吗?

对我来说这很重要,因为我有几十个现有代码文件,假设这是有效的,现在我无论如何都需要重新设计(因为这些编译器存在实际问题),但确切的重新设计将取决于答案。