2

我想问一个我理解的极端情况是非常糟糕的 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_typeT2template<typename T1, typename T2>

我对么?如果没有,有人可以演示使用模板类 A 并能够实例化模板的非专业版本的客户端代码吗?

4

1 回答 1

4

我想你是对的。无法访问主模板。如果您在定义部分特化之前尝试实例化它,那么您的程序将是错误的;无需诊断。

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

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

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

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

于 2012-06-17T13:33:31.897 回答