避免默认模板中的尖括号

use*_*087 8 c++ templates coding-style class-template

如果我有一个默认模板类型的模板类,但我必须写模板尖括号.有可能避免这种情况吗?

例:

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

...

tt<> t;  // how to avoid <>
std::cout << t.get() << std::endl;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已通过单独的命名空间完成此操作并重新声明该类:

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;
Run Code Online (Sandbox Code Playgroud)

问题是,如果我想使用其他类型的类,我必须去名称空间detail_.有没有其他解决方案,我还没有看到.

Dav*_*eas 8

......如果我想要上课......

这是混淆的常见原因.类模板不是类,而是生成类的模板.尖括号告诉编译器你想用给定的模板参数从类模板中生成一个类,没有尖括号你拥有的是模板.

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
Run Code Online (Sandbox Code Playgroud)

该语言不允许模板与同一名称空间中具有相同名称的类型共存,因此答案是无法完成.您可以创建类型别名,但必须为其指定不同的名称.


For*_*veR 6

你可以使用typedef ...

typedef tt<> tt_;
Run Code Online (Sandbox Code Playgroud)

然后简单地使用tt_.


man*_*lio 3

从C++17开始,由于类模板参数推导,事情发生了变化

tttt<>不是同一件事:类型和类模板不同,并且继续以不同的方式对待。

无论如何,在简单的场景中,例如您的示例中的场景,C++17 会假设您的意思,并且<>不再需要。

更多细节: