C++ 特征库:编写应用系数数学运算并适用于 ArrayBase 和 MatrixBase 的函数的最佳实践是什么?

问题描述 投票:0回答:1

想法1:编写一个带有

DenseBase
参数的函数
签名:
template <Derived> void foo(DenseBase<Derived> param)

在函数体内:
param.derived().array()

想法2:写两个函数,一个带

ArrayBase
参数,另一个带
MatrixBase
参数
函数签名:
template <Derived> void foo(ArrayBase<Derived> param)

在函数 A 体内:无需创建
ArrayWrapper

函数B签名:
template <Derived> void foo(MatrixBase<Derived> param)

在函数 B 体内:
param.array()

这是我编写一个应用系数数学运算并适用于

ArrayBase
MatrixBase.
的函数的两个想法,您认为哪个更好?还有其他最佳实践吗?

--------------------

c++ eigen eigen3
1个回答
0
投票

第一种方法的问题是

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);        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.