如何为 class 个数值数组同时重载所有数学函数

How to overload all math functions simultaneously for a class of numerical arrays

我设计了一个class的数值数组ndarray,它基本上包含一个双数组成员double *data。我重载了数学函数 double log(double),使其成为 class 的友元,当使用输入 ndarray 对象调用时,returns 是 ndarray 的对象与输入数组大小相同,其元素是输入数组的对数。 我的问题是,由于我不想为 double fun(double) 形式的所有数学函数重写相同的代码,我如何才能同时重载所有这些函数?

一种方法是将一个成员添加到您的 ndarray class 以将函数应用于每个元素并返回结果。这不会使所有数学函数超载,但可以让您执行 ndarray.apply(sin) 之类的操作。也许像下面这样(未经测试):

class myNdarray
{
  template <typename T>
  myNdarray apply(T func) const
  {
    myNdarray ret(*this);
    for (auto& elm: ret) elm = func(elm);
    return ret;
  }
};

在上面我使用 C++11 auto 并且我对你的类型的行为方式做了一些假设,但你可以在没有 C++11 的情况下实现它。您还可以删除模板类型 T 并指定一个显式类型(也许一个函数只接受一个双精度并返回一个双精度会更安全)。

遗憾的是,没有简单的方法可以做到这一点,因为 C++ 不支持协变继承或聚合。

您可以使用一些高级 boost::mpl 魔法来完成,但我建议只使用 std::valarray。它不仅看起来正是您所需要的,而且还具有一些简洁的延迟执行优化功能。唯一的缺点是它提供的数学方法数量有限,因此请先查看完整说明以确保它包含您需要的所有内容。