C++11 模板的模板专门化

C++11 模板的模板专门化,c++11,templates,template-specialization,eigen3,C++11,Templates,Template Specialization,Eigen3,我有一个使用本征C++库的函数: template <class Type1> void myFunction ( const Eigen::MatrixBase<Type1>& matrix) { } 模板 void myFunction(常数特征::矩阵基和矩阵) { } 现在,我想为类型std::complex专门化模板函数“myFunction”。请注意,类型“std::complex”也是一个模板。 如何定义这样的函数?您可以将myFunc

我有一个使用本征C++库的函数:

 template <class Type1>
 void myFunction ( const Eigen::MatrixBase<Type1>& matrix)
 {

 }
模板
void myFunction(常数特征::矩阵基和矩阵)
{
}
现在,我想为类型
std::complex
专门化模板函数“myFunction”。请注意,类型“
std::complex
”也是一个模板。
如何定义这样的函数?

您可以将
myFunction
重载为:

template <class Type1>
void myFunction ( const Eigen::MatrixBase<std::complex<Type1>>& matrix)
{
}
输出:

myFunction中的
(const Foo&)
在myFunction中(const Foo&)

您必须注意,
Eigen::MatrixBase
不是有效的类型,因为
MatrixBase
是CRTP基类。例如,
Matrix
间接继承自
MatrixBase
,等等。但是,每个
MatrixBase
都提供了一个
标量
类型,您可以使用SFINAE进行检查(即使用
std::enable_if
):

模板
typename std::enable_if::type
myFunction(常数特征::矩阵基和矩阵){
std::cout::type
myFunction(常数特征::矩阵基和矩阵){

std::cout这对
Eigen::MatrixBase
不起作用,因为它是一个类似CRTP的基类,
Eigen::MatrixBase
不是有效的类型。
#include <iostream>
#include <complex>

template <typename T>
struct Foo
{
};

template <typename T>
void myFunction ( const Foo<T>& f)
{
   std::cout << "In myFunction(const Foo&)\n";
}

template <typename T>
void myFunction ( const Foo<std::complex<T>>& f)
{
   std::cout << "In myFunction(const Foo<std::complex>&)\n";
}

int main()
{
   myFunction(Foo<int>());
   myFunction(Foo<std::complex<int>>());
}
template <class Derived>
typename std::enable_if<Eigen::NumTraits<typename Derived::Scalar>::IsComplex, void>::type 
myFunction(const Eigen::MatrixBase<Derived>& matrix) {
    std::cout << "Passed complex\n";
}

template <class Derived>
typename std::enable_if<!Eigen::NumTraits<typename Derived::Scalar>::IsComplex, void>::type 
myFunction(const Eigen::MatrixBase<Derived>& matrix) {
    std::cout << "Passed non-complex\n";
}