Шаблонная специализация для шаблона - PullRequest
0 голосов
/ 15 октября 2019

У меня есть функция, которая использует библиотеку Eigen C ++:

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

 }

Теперь я хотел бы специализировать шаблонную функцию "myFunction" для типа std::complex<Type>. Обратите внимание, что тип "std::complex<Type>" снова является шаблоном. Как определить такую ​​функцию?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Следует отметить, что Eigen::MatrixBase<std::complex<...> > не является допустимым типом, поскольку MatrixBase является базовым классом CRTP. Например, 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-Demo: https://godbolt.org/z/Q9YlPz

0 голосов
/ 15 октября 2019

Вы можете перегрузить 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>&)
...