模板的模板专业化
Template specialization for template
我有一个使用 Eigen C++ 库的函数:
template <class Type1>
void myFunction ( const Eigen::MatrixBase<Type1>& matrix)
{
}
现在,我想为类型 std::complex<Type>
专门化模板函数 "myFunction"。请注意,类型“std::complex<Type>
”又是一个模板。
如何定义这样的函数?
您可以将 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>>());
}
输出:
In myFunction(const Foo&)
In myFunction(const Foo<std::complex>&)
您必须注意 Eigen::MatrixBase<std::complex<...> >
不是有效类型,因为 MatrixBase
是基于 CRTP 的 class。例如,Matrix<double,2,2>
继承(间接)自 MatrixBase<Matrix<double,2,2> >
,等等。但是,每个 MatrixBase
提供一个 Scalar
类型,您可以使用 SFINAE 检查(即,使用 std::enable_if
):
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";
}
Godbolt-演示:https://godbolt.org/z/Q9YlPz
我有一个使用 Eigen C++ 库的函数:
template <class Type1>
void myFunction ( const Eigen::MatrixBase<Type1>& matrix)
{
}
现在,我想为类型 std::complex<Type>
专门化模板函数 "myFunction"。请注意,类型“std::complex<Type>
”又是一个模板。
如何定义这样的函数?
您可以将 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>>());
}
输出:
In myFunction(const Foo&)
In myFunction(const Foo<std::complex>&)
您必须注意 Eigen::MatrixBase<std::complex<...> >
不是有效类型,因为 MatrixBase
是基于 CRTP 的 class。例如,Matrix<double,2,2>
继承(间接)自 MatrixBase<Matrix<double,2,2> >
,等等。但是,每个 MatrixBase
提供一个 Scalar
类型,您可以使用 SFINAE 检查(即,使用 std::enable_if
):
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";
}
Godbolt-演示:https://godbolt.org/z/Q9YlPz