2013-12-14 2 views
2

Предположим, у меня есть шаблон:эквивалентности C++ шаблонов псевдонимами

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>; 

WOW. Кажется, это работает. Во-первых. Но тогда ... Если у меня есть функция, как это:

// 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" 

Оказывается, что е <Foo> и е <Bar> различные специализации е!

Итак:

  1. Является ли это GCC 4.8 ошибка или C++ 11 стандартный недостаток дизайна, или ожидается, что она будет так?
  2. Есть ли способ создать «настоящий» псевдоним шаблона в C++ 11? В C++ 14? C++ 17?

спасибо.

+0

Вы имеете в виду f > и f ? – polkadotcadaver

+0

@polkadotcadaver, конечно нет. – Sasha

+1

Просто скажите «нет», не пренебрегайте. – polkadotcadaver

ответ

5

Является ли это ошибкой GCC 4.8 или стандартным дефектом дизайна C++ 11, или ожидается, что это так?

Ожидается, что это будет так. Фактически, по иронии судьбы, Стандарт (проект) изначально содержал примеры, которые предлагали примеры, подобные твоим работам. Но нормативный текст не позволил этого, и этот пример был пересмотрен, чтобы больше не предлагать это.

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

Есть ли способ, чтобы создать "реальный" шаблон псевдоним в C++ 11? В C++ 14?

Нет. Было принято решение, что это особый случай общего шаблона псевдонимов, и если это вообще нужно решить с помощью более чистого синтаксиса, который непосредственно выражает псевдоним, когда обсуждалась связанная с этим проблема. Шаблоны псевдонимов в конечном итоге дают типы (и шаблонизируются по типам/«typedefs») и не являются «псевдонимами шаблонов», как они назывались в какой-то момент раннего составления.

Смежные вопросы