Перегрузка Eigen :: MatrixBase <T> - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть функция, для которой у меня есть несколько шаблонных перегрузок. Я, который добавить Eigen перегрузку к нему. Я хочу быть общим, чтобы иметь возможность принимать любую собственную матрицу. Поэтому я использую Eigen::MatrixBase<T>. Проблема начинается с перегрузки, когда компилятор не может распознать наиболее близкое совпадение с Eigen::MatrixBase<T>. Вот мой код:

#include <iostream>
#include <Eigen/Eigen>

template <class T>
void foo(const Eigen::MatrixBase<T> &data)
{
  std::cout << "Eigen" << std::endl;
}

// ... several other overloads

template <class T>
void foo(const T &data)
{
  std::cout << "other" << std::endl;
}

int main()
{
  Eigen::VectorXd a(2);

  a(0) = 0.;
  a(1) = 1.;

  foo(a);
}

При этом на выходе получается other. Как я могу сделать собственную перегрузку такой, чтобы она была наиболее подходящей для любой собственной матрицы?

1 Ответ

0 голосов
/ 18 ноября 2018

Eigen::VectorXd является typedef для Eigen::Matrix<double, Dynamic, 1>.Идя вперед, Eigen::MatrixBase<T> - базовый класс для Eigen::Matrix<T>.В разрешении перегрузки привязка ссылки экземпляра Eigen::VectorXd к выведенному параметру const Eigen::VectorXd& имеет ранг точного соответствия, который выигрывает при преобразовании Derived-to-Base (требуется void foo(const Eigen::MatrixBase<T>&).

КакВ этом решении вы можете отключить шаблон функции, производящий точное совпадение с проверкой SFINAE, чтобы исключить его из набора кандидатов, оставив только тот, который требует преобразования из производной в базовую, единственной жизнеспособной функции.

#include <type_traits>
#include <utility>

namespace detail
{
    template <typename T>
    std::true_type test(const volatile Eigen::MatrixBase<T>&);
    std::false_type test(...);
}

template <typename T>
using is_eigen_matrix = decltype(detail::test(std::declval<T&>()));

template <class T>
void foo(const Eigen::MatrixBase<T>& data)
{
}

template <class T>
auto foo(const T& data)
    -> typename std::enable_if<not is_eigen_matrix<T>::value>::type
{
}

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...