避免在默认模板中使用尖括号
Avoid angle brackets in default template
本文关键字:默认 更新时间:2023-10-16
如果我有一个默认模板类型的模板类,我必须写模板尖括号。是否有可能避免这种情况?
的例子:
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_。是否有其他的解决方案,我还没有看到
…如果我想使用类
这是一个常见的混淆来源。类模板不是一个类,而是一个从中生成类的模板。尖括号告诉编译器你想用给定的模板参数从类模板中生成一个类,没有尖括号你得到的就是一个模板。
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
语言不允许模板和具有相同名称的类型在同一名称空间中共存,因此答案是不能这样做。你可以创建一个类型别名,但是你必须给它一个不同的名字。
可以使用typedef…
typedef tt<> tt_;
然后直接使用tt_
从c++ 17开始,由于类模板的参数演绎,情况发生了变化。
tt
和tt<>
不是同一件事:类型和类模板不同,继续区别对待。
无论如何,在像你的例子中的一个简单的场景中,c++ 17假定你的意思和<>
不再需要了。
更多细节:
- 模板默认参数(特别是https://stackoverflow.com/a/50970942/3235496);
- 为什么<>当指定一个模板类有默认值的所有模板参数时需要?
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 具有默认值的引用获取函数
- 具有默认模板类型的默认构造函数的类型推导
- 当给定默认值时,为什么此模板参数推导失败
- 修改 VS Code 中的默认C++代码段
- 声明默认的模板化函数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何使用非默认构造函数实例化模板化类
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 格式化浮点值:返回默认值
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr