c++模板专门化思考

Thinking in C++ template specialization

本文关键字:专门化 c++      更新时间:2023-10-16

环境:Microsoft Visual Studio 2010

编码标准:c++ 0x compatible

我有一个类模板

template <typename T1, int I>
class A
{
    public template <typename T2> void f(T2 x);
    /*...*/
};
template <typename T1, int I>
template <typename T2>
void A<T1, I>::f(T2 x)
{
    /*...*/
}

和以上类

的部分专门化
template <int I>
class A<char, I>
{
    public template <typename T2> void f(T2 x);
    /*...*/
};

那么我可以像下面这样在部分专门化类中专门化成员函数吗?

template <int I>
template <>
void A<char, I>::f<double>(double x)
{
}

谢谢!

NB:我没有在研究它,但在想它是否适用。如果你知道这个规则的话,很容易评分。

这是无效的,因为如果不向任何封闭的类模板提供固定的模板参数,就不能显式特化成员函数。

不兼容c++ 11,但正在MSVC上工作

Microsoft编译器有一个扩展,允许在类模板中声明显式特化。尽管我从未尝试过,但很有可能它会接受以下非标准代码

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);
    template<> void f<double>(double x) {
    }
    /*...*/
};

更新:Clang编译并报告

// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
                 Microsoft extension [-Wmicrosoft]
  template<> void f<double>(double x) {
                  ^

c++ 11/c++ 03兼容

这里的方法是重载而不是专门化

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);
    void f(double x) {
    }
    /*...*/
};