Как я могу создать конечный тип возврата с примитивами и Eigen? - PullRequest
2 голосов
/ 20 мая 2019

Я хочу написать шаблонную функцию на и хочу сделать тип возвращаемого значения функции максимально гибким. Поэтому иногда параметры, принимаемые функцией, являются примитивами (int, double), но иногда они могут быть контейнерами или даже Eigen объектами!

Так что с примитивами я бы просто написал что-то вроде этого:

template<typename T, typename U>
auto normalise(T first, U second)
{
    return first * second;
}

Но предположим, что если я поставлю Eigen::VectorXd, этот код не будет работать. Как я могу преодолеть этот барьер?

Я собирался добавить оператор if, но я не смогу ничего сравнить, так как параметры не будут объявлены до этого.

1 Ответ

2 голосов
/ 20 мая 2019

Используйте простые SFINE , чтобы отсортировать типы, для которых должна быть реализована функция шаблона.

// variable template for sorting out the allowed types
template<typename Type>
static constexpr bool is_allowed = std::is_same_v<Type, int> ||
                                   std::is_same_v<Type, double> || 
                                   std::is_same_v<Type, Eigen::VectorXd> 
                                   /* add other types which needed to be included */;

// type traits for sorting out the allowed types
template<typename T, typename U, typename ReType = void>
using enable_for_allowed_types = std::enable_if_t<
    is_allowed<T> && is_allowed<U>,
    ReType
>;

template<typename T, typename U>
auto normalise(T first, U second)
                -> enable_for_allowed_types<T, U, decltype(first*second)>
{
    return first * second;
}
...