类型特征以检查特征类型是表达式(不带存储)还是矩阵或数组(带存储)?

时间:2018-12-13 22:12:56

标签: templates eigen generic-programming typetraits eigen3

我正在尝试使用一些模板魔术来区分两种本征类型。

    属于Matrix或Array的
  1. 类型,例如MatrixXd,VectorXd等。这些类型具有自己的数据存储。

  2. 是表达式的类型,例如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) {...}

0 个答案:

没有答案