Я пытаюсь перегрузить некоторую функцию в зависимости от того, передаю ли я им матрицу Eigen, и я хотел сделать себе какую-нибудь симпатичную constexpr
функцию для улучшения читабельности.
Для этогоЯ решил подражать реализации std::is_same
, данной для https://en.cppreference.com/w/cpp/types/is_same
template<class T, class U>
struct is_same : std::false_type {};
template<class T>
struct is_same<T, T> : std::true_type {};
И я сказал себе, конечно, достаточно просто:
template <typename T>
bool constexpr is_eigen() { return false; }
template <typename T, typename Eigen::Matrix<typename T::Scalar,
T::RowsAtCompileTime,
T::ColsAtCompileTime,
T::Options,
T::MaxRowsAtCompileTime,
T::MaxColsAtCompileTime>>
bool constexpr is_eigen() { return true; }
Однако мои собственные Eigen-типы разрешаются до первогоспециализация шаблона, не первая (установка фиктивной typename U
не помогает).
Я также пробовал что-то вроде:
template <typename T, bool is_it = std::is_same<T,
Eigen::Matrix<typename T::Scalar,
T::RowsAtCompileTime,
T::ColsAtCompileTime,
T::Options,
T::MaxRowsAtCompileTime,
T::MaxColsAtCompileTime>>::value>
bool constexpr is_eigen() { return is_it; }
template <typename T, typename = std::enable_if_t<!std::is_class<T>::value>>
bool constexpr is_eigen() { return false; }
Но для не-собственных классов первая перегрузка нене решается, и попытки что-либо изменить, что означает, что Eigen все равно попадет в ложную ветвь
По сути, любая ветвь по умолчанию, с которой я столкнусь, будет принята даже для Eigen-типов.Я ненавижу СФИНА: (