模板的模板专业化

时间:2019-10-15 17:51:29

标签: c++11 templates template-specialization eigen3

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

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

 }

现在,我想将std::complex<Type>类型的模板函数“ myFunction”专用化。请注意,类型“ std::complex<Type>”还是一个模板。 如何定义这样的功能?

2 个答案:

答案 0 :(得分:1)

您必须注意,Eigen::MatrixBase<std::complex<...> >不是有效的类型,因为MatrixBase是基于CRTP的类。例如,Matrix<double,2,2>(间接地)继承自MatrixBase<Matrix<double,2,2> >等。但是,每个MatrixBase都提供了Scalar类型,您可以使用SFINAE(即,使用{{1} }):

std::enable_if

Godbolt-Demo:https://godbolt.org/z/Q9YlPz

答案 1 :(得分:0)

您可以将public string Error重载为:

myFunction

不要认为它是第一个功能的特殊化。只是过载。

以下程序使用template <class Type1> void myFunction ( const Eigen::MatrixBase<std::complex<Type1>>& matrix) { } 演示了该概念。

Foo

输出:

#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>>());
}