首页 > 解决方案 > 键入 trait 以检查 Eigen 类型是表达式(无存储)还是矩阵或数组(有存储)?

问题描述

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

  1. Matrix 或 Array 的特化类型,如 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或.inputfunc(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) {...}

标签: templateseigengeneric-programmingtypetraitseigen3

解决方案


推荐阅读