如何使用基元和 Eigen 创建尾随 return 类型?
How can I create a trailing return type with primitives and Eigen?
我想在 c++14 中编写一个模板函数,并且我想使 return 类型的函数尽可能灵活。因此,有时函数采用的参数是原始参数(int
、double
),但有时它们可以是容器甚至是 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;
}
我想在 c++14 中编写一个模板函数,并且我想使 return 类型的函数尽可能灵活。因此,有时函数采用的参数是原始参数(int
、double
),但有时它们可以是容器甚至是 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;
}