如何为 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
。它不仅看起来正是您所需要的,而且还具有一些简洁的延迟执行优化功能。唯一的缺点是它提供的数学方法数量有限,因此请先查看完整说明以确保它包含您需要的所有内容。
我设计了一个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
。它不仅看起来正是您所需要的,而且还具有一些简洁的延迟执行优化功能。唯一的缺点是它提供的数学方法数量有限,因此请先查看完整说明以确保它包含您需要的所有内容。