如何使用基元和 Eigen 创建尾随 return 类型?

How can I create a trailing return type with primitives and Eigen?

我想在 中编写一个模板函数,并且我想使 return 类型的函数尽可能灵活。因此,有时函数采用的参数是原始参数(intdouble),但有时它们可​​以是容器甚至是 Eigen 对象!

所以对于原语,我会简单地写这样的东西:

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

但是假设如果我提供 Eigen::VectorXd,该代码将不起作用。我怎样才能克服这个障碍?

我想放一个 if 语句,但我无法比较任何东西,因为在此之前不会声明参数。

使用简单的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;
}