10

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

例子:

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_。是否有另一种解决方案,我还没有看到。

4

3 回答 3

8

...如果我想使用课程...

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

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

template <template <typename>  class T>
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

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

于 2013-04-15T12:21:43.440 回答
6

你可以使用类型定义...

typedef tt<> tt_;

然后简单地使用tt_.

于 2013-04-15T12:06:44.173 回答
3

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

tt并且tt<>不是一回事:类型和类模板是不同的,并且继续被区别对待。

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

更多细节:

于 2019-03-18T11:21:49.723 回答