Предположим, у меня есть шаблон:эквивалентности 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> различные специализации е!
Итак:
- Является ли это GCC 4.8 ошибка или C++ 11 стандартный недостаток дизайна, или ожидается, что она будет так?
- Есть ли способ создать «настоящий» псевдоним шаблона в C++ 11? В C++ 14? C++ 17?
спасибо.
Вы имеете в виду f> и f ? –
polkadotcadaver
@polkadotcadaver, конечно нет. – Sasha
Просто скажите «нет», не пренебрегайте. – polkadotcadaver