避免在默认模板尖括号(Avoid angle brackets in default templat

2019-08-31 06:20发布

如果我有一个默认的模板类型的模板类,我写的模板尖括号。 是它在某种程度上能够避免这种情况?

例:

template <typename T=int>
class tt {
public:
  T get() { return 5; }
};

...

tt<> t;  // how to avoid <>
std::cout << t.get() << std::endl;

到现在为止我已经由一个单独的命名空间,并重新声明类这样做:

namespace detail_ {
template <typename T=int>
class tt {
public:
  T get() { return 5; }
};
}

class tt : public detail_::tt {}

...

tt t;
std::cout << t.get() << std::endl;

问题是,如果我想使用的类与其他类型的我走了过来命名空间detail_。 有另一种解决方案 ,我没有看到呢。

Answer 1:

......如果我想使用的类...

这是混乱的公共源极。 类模板不是类,而是从其中产生的类的模板。 尖括号就是告诉你要产生一类出给定模板参数的类模板的编译器,没有尖括号你有什么是一个模板

template <typename T = int>
struct TemplateClass {...};

template <template class T<typename> >
void f() {
   T<int> t; ...
}
template <typename T>
void g() {
   T t; ...
}

f<TemplateClass>();     // Accepts a template with a single type argument
g<TemplateClass<> >();  // Accepts a type, that can be generated out of the template

语言不允许模板,并在同一个命名空间中的同名类型的共存,所以答案是,它无法做到的。 您可以创建一个类型别名,但你必须给它一个不同的名称。



Answer 2:

您可以使用的typedef ...

typedef tt<> tt_;

然后简单地使用tt_



Answer 3:

由于因为C ++ 17, 类模板参数推导 ,事情发生了变化 。

tttt<>是不一样的事情:类型和类模板是不同的,并继续区别对待。

反正在简单的场景就像一个在你的例子,C ++ 17假定你的意思和<>不再需要的。

更多详情:

  • 模板默认参数 (具体https://stackoverflow.com/a/50970942/3235496 );
  • 为什么<>指定其具有用于其所有的模板参数默认模板类时,需要?


文章来源: Avoid angle brackets in default template