我正在尝试使用一些模板魔术来区分两种本征类型。
类型,例如MatrixXd,VectorXd等。这些类型具有自己的数据存储。
是表达式的类型,例如CwiseBinaryOp等。这些是由a + b
之类的表达式返回的类型。
目标:目标是允许以下功能模板具有不同的行为:
template<typename T, typename Functor>
decltype(auto) func(const Functor& functor, T&& input) {
if constexpr ([T is expression or lvalue reference of non-expression]) {
return functor(std::forward<T>(input));
} else /*[T is rvalue reference of non-expression]*/ {
// update in-place
input = functor(std::forward<T>(input));
return std::move(input)
}
}
这样,我可以包装任何lambda或函子(请注意:此函子的实现与[](auto&& input){return [expr]
}类似,因此它返回一个基于输入之上的表达式,该表达式可能已经或可能不是一个表达式)到func
,因此我可以选择是在input
周围构建表达式还是将input
持有的数据移交给返回的对象,同时评估表达式关于我叫func(input)
还是func(std::move(input))
的问题。
有什么想法吗?谢谢!
编辑:
这是我找到的解决方案:
template<typename Derived>
struct has_storage
: std::is_base_of<Eigen::PlainObjectBase<std::decay_t<Derived> >, std::decay_t<Derived> >
{};
... //in func body:
if constexpr (std::is_lvalue_reference<T>::value || !has_storage<T>::value) {...}