5

我有一个模板类矩阵。我想为复杂类型专门化一个函数,其中 T 可以是任何东西。我试过这个:

  6 template <typename T>
  7 class Matrix {
  8       public :
  9             static void f();
 10 };          
 11 template<typename T> void Matrix<T>::f() { cout << "generic" << endl; }
 12 template<> void Matrix<double>::f() { cout << "double" << endl; }
 13 template<typename T> void Matrix<std::complex<T> >::f() { cout << "complex" << endl; }

第 13 行无法编译。我怎样才能做到这一点 ?

4

3 回答 3

3

在第 11 行和第 12 行中,您声明了 C++ 标准 14.7/3 允许的类模板成员的显式特化(14.5.2/2 也包含一个很好的示例)。在第 13 行中,您尝试对类模板进行部分特化,但这种形式不允许这样做(这是部分特化,因为您不知道整个类型std::complex<T>,因为它仍然依赖于T)。你应该对整个班级进行部分专业化。

于 2010-05-12T19:28:25.600 回答
1

事实上,我通过 Boost 找到了一个聪明的方法。因为我不希望我的库依赖于 Boost,所以这里是代码:

template <class T, T val> struct integral_constant
{
      typedef integral_constant<T, val> type;
      typedef T value_type;
      static const T value = val;
};    
typedef integral_constant<bool, true>  true_type;
typedef integral_constant<bool, false> false_type;
template <typename T> struct is_complex : false_type{};
template <typename T> struct is_complex<std::complex<T> > : true_type{};

template <typename T>
class Matrix {
      public :
            static void f() { f_( typename is_complex<T>::type() ); }
      private :
            static void f_( true_type ) { cout << "generic complex" << endl; }
            static void f_( false_type ) { cout << "generic real" << endl; }
};          
template<> void Matrix<double>::f() { cout << "double" << endl; }

这样,我可以使用函数重载和模板来实现我的目标。

于 2010-05-13T12:07:54.490 回答
0

如链接答案中所述,您需要做的是专门化整个类,而不是简单的函数:

#include <iostream>
#include <complex>
using namespace std;

template <typename T>
class Matrix {
public :
    static void f();
};

template<typename T> void Matrix<T>::f() { cout << "generic" << endl; }
template<> void Matrix<double>::f() { cout << "double" << endl; }

template <typename T>
class Matrix<std::complex<T> > {
public:
    static void f() { cout << "complex" << endl; }
};

int main(void) {
  Matrix<complex<double> >::f();
  return 0;
}
于 2010-05-12T19:25:55.933 回答