使用泛型,可变的MatrixBase <derived>引用实现函数的最佳方法是使用C ++中的Blocks 1y? (包括工作示例)

时间:2017-04-23 23:31:01

标签: c++ c++11 templates matrix eigen

背景

首先开始修改扩展初始化列表以使用子矩阵,并想知道如何推广用于处理可变矩阵的方法(例如Matirix<...>Block<...>)。 (如果你很好奇here's my post,但这些尝试要么是无效的要么是失败的。)

我回顾了其中的一些内容:

工作示例

鉴于这一切,我提出(我希望是)一个相对简单的模式:

从示例中获取片段,这是我能看到的最干净的模式类型:

XprType

这可以用于以下表达式:

template<typename Derived>
Derived extract_mutable_derived_type(MatrixBase<Derived>&& value);
template<typename Derived>
Derived extract_mutable_derived_type(MatrixBase<Derived>& value);

template<typename T>
using mutable_matrix_derived_type = decltype(extract_mutable_derived_type(std::declval<T>()));

// Example using mutable_matrix_derived_type:
template<typename XprType,
    typename Derived = mutable_matrix_derived_type<XprType>>
auto&& fill(XprType&& x) {
    // cannot use decltype(x) on return type?
    x.setConstant(1);
    return std::forward<XprType>(x);
}

主要问题

合并左值和右值的情况以使用块之类的东西看起来有点hacky(不如C98版本),并且不确定是否有更好的机制出现。

当它们是右值时,是否有更好的机制来处理矩阵(偶数块)?

或者你通常必须专注自己,并且(a)将这些例子加在一起,(b)基于rvalue案例进行专门化,或者(c)在泛型MatrixXd A(2, 2); fill(A); // lvalue, dynamic Matrix3d B; fill(B); // lvalue, static MatrixXd C(3, 2); fill(C.block(0, 0, 2, 2)); // rvalue, dynamic. Works as intended. Vector3d y; fill(y.head(2)); // rvalue, static 之间进行专门化({{ 1}})和MatrixBase<Derived>

0 个答案:

没有答案