Специализация члена шаблонного класса для типа параметра шаблонного класса

У меня есть шаблонный класс Матрица. Я хочу специализировать функцию для комплекса типа, где 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 не компилирует. Как я могу сделать это?

5
задан Maxime 12 May 2010 в 18:53
поделиться

3 ответа

На самом деле, я нашел умный способ сделать это через 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; }

Таким образом, я могу использовать перегрузку функций и шаблон для достижения своей цели.

1
ответ дан 15 December 2019 в 00:53
поделиться

Как описано в связанном ответе, вам нужно будет специализировать весь класс, а не простую функцию:

#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;
}
0
ответ дан 15 December 2019 в 00:53
поделиться

В строках 11 и 12 у вас есть объявление явной специализации для члена шаблона класса, что разрешено стандартом C ++ Standard 14.7 / 3 (14.5.2 / 2 тоже есть хороший пример). В строке 13 вы пытаетесь частично специализировать шаблон класса, что недопустимо в этой форме (это частичная специализация, потому что вы не знаете весь тип std :: complex , потому что это все еще зависит от T ). Вы должны частично специализировать весь класс.

3
ответ дан 15 December 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: