На самом деле, я нашел умный способ сделать это через 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; }
Таким образом, я могу использовать перегрузку функций и шаблон для достижения своей цели.