gpt4 book ai didi

c++ - 边缘案例 : When (only) reversing order of template parameters in specialization, 能否达到非专业版本?

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:37 26 4
gpt4 key购买 nike

我想问一个边缘案例场景,据我所知这是非常糟糕的 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 并能够实例化模板的非专用版本的客户端代码吗?

最佳答案

我认为你是对的。无法访问主模板。如果您在定义偏特化之前尝试实例化它,那么您的程序将是非良构的;无需诊断。

最近有人考虑将部分特化标记为格式错误,如果它不比主模板更特化(通过部分排序规则)。虽然您的代码不会造成任何伤害,但人们提出了另一个测试用例,其中部分特化并不比主模板更特化:

template <int B, typename Type1, typename... Types>
struct A;

template<typename... Types>
struct A<0, Types...> { };

对于第一个参数,主模板不太专业,但对于后面的参数,主模板更专业,反之亦然。通过不对偏特化中的第一个参数进行特化,而是保持它可变,您甚至可以使偏特化比主模板较少特化,这有点奇怪,而不是偏特化的目的。

关于c++ - 边缘案例 : When (only) reversing order of template parameters in specialization, 能否达到非专业版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071415/

26 4 0