Sas*_*sha 2 alias templates using c++11
假设我有一个模板:
template<typename T>
struct Foo {int f1, f2;};
Run Code Online (Sandbox Code Playgroud)
我想为它创建一个新的别名.
// This will not work, don't even try:
// using Foo = Bar;
// Instead do like this:
template<typename T>
using Bar = Foo<T>;
Run Code Online (Sandbox Code Playgroud)
哇.它似乎工作.首先.但是......如果我有这样的功能:
// 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"
Run Code Online (Sandbox Code Playgroud)
似乎f <Foo>和f <Bar>是f的不同特化!
所以:
谢谢.
这是GCC 4.8的错误,还是C++ 11的标准设计缺陷,或者预计是这样?
预计会如此.实际上,具有讽刺意味的是,标准(草案)最初包含了一些示例,这些示例表明了像您这样的示例.但是规范性文本并没有允许这样做,并且修改了这个例子以便不再提出这个问题.
见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1244
有没有办法在C++ 11中创建"真正的"模板别名?在C++ 14中?
不是.决定这是一般别名模板的一个非常特殊的情况,如果在讨论上述链接问题时,应该用直接表达别名的更清晰的语法来解决.别名模板最终产生类型(并且模仿类型/"typedef")并且不是"模板别名",就像它们在早期绘图中的某些时候被调用一样.
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |