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

c++11 - SFINAE 设置别名模板

我想知道是否可以使用 SFINAE 在不同的类中设置别名模板,具体取决于特征类中是否存在别名。

本质上,我们有 2 个类 Foo1 和 Foo2 以及它们的特征类,在这种情况下定义类型别名以简化它。在所有情况下,我们将拥有 type1 别名,在某些情况下,我们将拥有 type2。

在另一个类中(在我的情况下,它实际上是 Foo 的基类)我想为这些类型设置别名。

我怎样才能真正实现用伪代码编写的那种东西

0 投票
1 回答
180 浏览

c++ - 如何使用模板别名删除一个不必要的参数

我有这个模板类:

因为我需要一个包含函数的类和函数返回的值(因为我需要对它的引用)。

如您所见,我有两个模板参数,但实际上第一个是多余的。是否有可能以某种方式将其删除?模板别名?比宏更好的东西

0 投票
1 回答
122 浏览

c++ - 模板别名的标识

让我们考虑一组模板别名:

id_foo, id_bar,是id_buz相同的还是不同的类型?foo, bar,是buz相同的还是不同的模板?

不同的编译器对此有不同的看法。特别,

  • MSVC 2015 和 clang 3.5 对待它们都是不同的
  • gcc 4.9 对待buzfoo

第 14.5.7 章“别名模板”中的标准 C++11 不清楚。

0 投票
1 回答
213 浏览

c++ - C++ const 引用的形式是什么(不是引用 const,而是 const 引用)

给定

使用 Visual C++ 和 g++,此代码按照注释中的指示进行编译,只会foo2引发编译错误。

我希望foo类似地导致编译错误,以便能够使用具有与核心语言的“失败实验”运算符符号相同的约束的符号。

我怀疑编译的原因与foo编译调用的原因相同,constref_call与模板有关的一些豁免,但真的是这样 - 这里标准的正式规则是什么?

0 投票
1 回答
1004 浏览

c++ - C++ 动态向下转换为模板模板参数为类模板或别名模板的类模板

我希望标题有意义。我可能想念正确表达它的词汇。

好吧,一个例子可能会更清楚。

对我来说问题是:在以下某些情况下(写在注释中),动态向下转换在运行时返回 0。我想知道这是否是正确的行为(使用 C++11),还有为什么,以及我能做些什么来使它工作。显然,Templated 和 A::A_templated 被视为不同的类,尽管使用别名“using”定义为相同。简单的 typedef 别名不会出现问题。


我提出另一种看待问题的方法,这可能更清楚。在试图避免上面的例子之后,我正面临着它。以下示例基本上说明了 Bogdan 指出的内容。我发现编译器无法使用 Templated_alias 解析 Templated 非常令人沮丧。我想知道是否存在编译选项,它可以通过模板别名强制类型解析。


多亏了波格丹的诡计,在流了一些鼻血之后,我设法找到了某种解决方案。这个想法是建立一个负责“过滤”模板类的潜在别名的类。每个需要“过滤”的模板类都需要一个规范。该方法的主要缺点是过滤因此需要在模板类用作模板参数的任何地方使用以保持一致。

输出给出:


使用上述技巧后。我遇到了不同的问题。不能绝对确定它是否相关,但很有可能。编译器似乎很难正确构建“动态表”。我在 C++ 中询问了这个问题,什么可以使 type_info::hash_code 对于两个(据说)相同的对象有所不同 可能是我的坏事,但现在我不建议使用 Clang 3.1 的技巧。

0 投票
1 回答
3028 浏览

c++ - 别名模板的包扩展

似乎一个包参数只能在别名模板的包参数的位置展开。这不适用于类或函数模板:

更简单的情况:

上面的代码使用and in和生成错误(即使f从未实例化)。c++11c++14g++ 4.9g++ 5.1clang 3.5

为什么不允许这样做?一般规则是什么?我认为没有理由限制这一点。这似乎是一个非常奇怪的禁令。

至于为什么不像x_fix_t第一个变体那样写,更清楚的是x_t有一个强制性的第一个参数。(例如,这是f()不允许的原因)。但这并不重要,修复很容易。问题仍然存在:为什么?

gcc 错误:

叮当错误:

0 投票
0 回答
41 浏览

c++ - 模板别名作为从属名称

如何根据另一个模板函数的依赖模板别名调用模板函数?

例如,有一个模板类和一个模板函数,它接受这个类作为模板参数:

然后,有一个类,其中包含一个模板别名FooClass

最后,还有另一个模板函数,它接受MyClass作为模板参数并使用它以适当的类型FooAlias调用:printFoo

如果我直接使用所需的类或其别名,它不依赖于模板参数,一切都很好。一旦我尝试使用依赖别名,就会收到以下错误消息:

如何传递T::FooAlias给的正确方法是printFoo()什么?

0 投票
2 回答
1008 浏览

c++ - 模板别名范围

根据http://en.cppreference.com/w/cpp/language/type_alias,别名是块级声明。它没有说明模板别名有什么特别之处,因此应该阅读模板别名也是块级声明。

但是,不可能在块级别使用模板别名。错误因编译器而异 - 虽然 g++ 给出了一个有意义的消息,说模板在块范围内是不允许的,但 clang 是完全神秘的。(例如:http ://coliru.stacked-crooked.com/a/0f0862dad6f3da61 )。

到目前为止我的问题:

  • cppreference 是否未能指定模板别名不能在块范围内使用?(或者我需要参加阅读课程吗?)
  • 编译器在块级别拒绝模板别名是否正确(我发现这个功能对我的特定编码习惯非常有趣)
  • 如果第二个答案是肯定的,那么这样做的理由是什么?为什么编译器会拒绝我这种纯语法糖?
0 投票
1 回答
565 浏览

c++ - CUDA 中的 C++11 别名模板

基本问题是CUDA 编译器是否支持别名模板?

我在带有 gcc-4.8 的 Ubuntu 上使用 CUDA 7.5。我所有的模板类都在头文件中定义,并#include在编译期间 d 到单个翻译单元中。

我有一个简单的cuda_array类,它提供了一个围绕std::vector. 它本质上是一个非常简单的版本,thrust::host_vector结合了thrust::device_vector. 它的声明是

为了制作一个矩阵,我只是做了一个快速的模板别名。

我想将我的矩阵向量乘法 CUDA 内核映射到重载operator*的类型安全和易于使用(它留给调用者以确保pushpull正确调用)。

在我的'main.cpp'中,我有

最后一行抛出一个错误说

我追查了所有我能想到的模板类型推断错误的常见嫌疑人,但没有任何效果。无奈之下,我将我的cuda_matrix别名模板转换为模板类。

编译错误消失了!因此,CUDA 似乎还不支持别名模板。还是我做了一些我想不通的傻事?

0 投票
2 回答
1189 浏览

c++ - 是否可以将别名模板标记为朋友?

想象一下我们有这样的代码:

可以加BeFriend好友吗?(属于Util,或任何其他类别)。

 编辑

尝试了“明显”的语法,但在 Clang 3.6 中都失败了。

我不知道第二种语法,但在这个答案中找到了它。它似乎对模板别名有效(并且是必需的),但在这种别名模板化的情况下没有帮助。

注意:正如一些人可以从最小示例中推断出的那样,我正在寻找一种方法来解决 C++ 不允许与部分模板专业化成为朋友的限制)