我有一个使用Eigen C ++库的函数:
template <class Type1>
void myFunction ( const Eigen::MatrixBase<Type1>& matrix)
{
}
现在,我想将std::complex<Type>
类型的模板函数“ myFunction”专用化。请注意,类型“ std::complex<Type>
”还是一个模板。
如何定义这样的功能?
答案 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>>());
}