首先开始修改扩展初始化列表以使用子矩阵,并想知道如何推广用于处理可变矩阵的方法(例如Matirix<...>
,Block<...>
)。
(如果你很好奇here's my post,但这些尝试要么是无效的要么是失败的。)
我回顾了其中的一些内容:
const
&
)和右值(&&
)引用,但最终会重新实现该方法。 decltype
的简洁用法,用于在编译时获取Derived
特定的MatrixBase
&&
与{{1}相关联,提供了解释为什么MatrixBase<Derived>
不会成为模板化的完美转发案例的原因}})鉴于这一切,我提出(我希望是)一个相对简单的模式:
从示例中获取片段,这是我能看到的最干净的模式类型:
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>
?