有时我想写两个模板,如:
template <typename Type1>
class A{
...
};
template <typename Type1, typename Type2>
class A{
...
};
Run Code Online (Sandbox Code Playgroud)
但似乎有两个共享相同名称但具有不同参数的模板是非法的.我必须这样命名A_1,A_2.我认为如果我可以这样做,特别是在实现Functors时可能会有用.
为什么C++不允许这样?在某些情况下难以实施或模糊吗?这将在更高版本的C++上得到支持吗?
Tri*_*dle 13
它非常有用,但正如你所说,C++不允许你直接这样做.但是,您可以使用部分特化来完成相同的操作.
如果在C++ 11中使用可变参数模板,这一点特别容易,因为您可以执行以下操作:
template <typename... T>
struct A; // Declared but not defined
template <typename T, typename U>
struct A<T, U>
{
// definition of the two-parameter case
};
template <typename T>
struct A<T>
{
// definition of the one-parameter case
};
Run Code Online (Sandbox Code Playgroud)
实际上,这允许您拥有A<T, U>和A<T>完全分离的类型.尝试A使用更多模板参数实例化将导致编译错误,因为一般情况未定义(如果需要,可以使用a static_assert来提供一个很好的错误消息).
使用默认模板参数(设置为空虚拟结构或者void)可以在C++ 03中实现类似的东西,但C++ 11版本的IMO要好得多.
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |