想法1:编写一个带有
DenseBase
参数的函数template <Derived> void foo(DenseBase<Derived> param)
param.derived().array()
想法2:写两个函数,一个带
ArrayBase
参数,另一个带MatrixBase
参数template <Derived> void foo(ArrayBase<Derived> param)
ArrayWrapper
template <Derived> void foo(MatrixBase<Derived> param)
param.array()
这是我编写一个应用系数数学运算并适用于
ArrayBase
和 MatrixBase.
的函数的两个想法,您认为哪个更好?还有其他最佳实践吗?
--------------------
第一种方法的问题是
ArrayBase
类不提供 .array()
方法,因此您需要在这里进行某种区分。然而,从 C++17 开始,您可以使用 if constexpr
在一个函数中完成此操作。
这样,您可以编写一个带有
DenseBase
参数的函数,并区别对待这两种情况。您可以引入另一个 lambda 以避免代码重复:
template<typename Derived>
void cwise_transform(DenseBase<Derived>& inout)
{
auto trans = [](auto& m) { return m.abs(); }; //abs as example
if constexpr(std::is_base_of_v<MatrixBase<Derived>, Derived>)
{
trans(inout.array());
}
else
{
trans(inout);
}
}