【问题标题】:Equivalence of C++ template aliasesC++ 模板别名的等价性
【发布时间】:2013-12-14 14:37:10
【问题描述】:

假设我有一个模板:

template<typename T>
struct Foo {int f1, f2;};

我想为它创建一个新别名。

// This will not work, don't even try:
// using Foo = Bar;

// Instead do like this:
template<typename T>
using Bar = Foo<T>;

哇。它似乎工作。首先。 但是……如果我有这样的功能:

// Generic f:
template<template<typename> class Tpl>
void f() {std::cout<<"Generic f"<<std::endl;}

// Specialization of f for Foo:
template<> void f<Foo>() {std::cout<<"f<Foo>"<<std::endl;}

int main() {...; f<Bar>(); ...} //outputs "Generic f"

看来 f 和 f 是 f! 的不同特化

所以:

  1. 这是 GCC 4.8 错误,还是 C++11 标准设计缺陷,还是预期如此?
  2. 有没有办法在 C++11 中创建“真正的”模板别名?在 C++14 中? C++17?

谢谢。

【问题讨论】:

  • 你的意思是 f> 和 f
  • @polkadotcadaver,当然不是。
  • 只说不,不要轻视。
  • 您在这里缺少classtemplate&lt;template&lt;typename&gt; Tpl&gt;
  • 也许你可以说别名模板是别名的模板,而不是模板的别名

标签: templates c++11 alias using


【解决方案1】:

这是 GCC 4.8 错误,还是 C++11 标准设计缺陷,还是预期如此?

预计会如此。实际上,具有讽刺意味的是,标准(草案)最初包含一些示例,这些示例建议您使用类似的示例。但规范性文本不允许这样做,并且修改了示例以不再建议这一点。

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1244

有没有办法在 C++11 中创建“真正的”模板别名?在 C++14 中?

没有。当讨论上述链接问题时,决定这是通用别名模板的一个非常特殊的情况,如果这应该使用直接表达别名的更简洁的语法来解决的话。别名模板最终会产生类型(并在类型/“typedef”上进行模板化),而不是像在早期起草中的某个时候那样调用的“模板别名”。

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多