我想问一个我理解的极端情况是非常糟糕的 C++ 编程形式,而且很可能永远不应该在实践中使用。但是,我想确保我完全理解模板语法。
我的问题简单地涉及模板专业化中模板参数的反转。这是最简洁地演示我的问题的示例代码:
#include <iostream>
template<typename T1, typename T2>
class A
{
public:
int foo()
{
return 1;
}
};
template<typename T1, typename T2>
class A<T2, T1> // <-- Arguments reversed in template specialization
{
public:
int foo()
{
return 2;
}
};
int main()
{
A<int, int> a;
std::cout << a.foo(); // Output is "2"; the specialized version is called.
return 0;
}
如上所述,当我运行该程序时,输出为“2”:模板类的专用版本由模板编译器实例化。
考虑到这一点,我相信在任何情况下都不可能编写模板类的非专业版本由模板编译器实例化的代码。因为模板编译器首先寻找匹配的特化,并且因为双参数特化总是匹配任何实例化类型的客户端代码(特别是,对应于特化模板定义中的语法),它因此,似乎在任何情况下都无法达到非专业版本。A<first_type, second_type>
first_type
T2
template<typename T1, typename T2>
我对么?如果没有,有人可以演示使用模板类 A 并能够实例化模板的非专业版本的客户端代码吗?