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