【发布时间】:2016-04-04 06:48:05
【问题描述】:
这是my previous one 的后续问题。我正在构建一个具有基本矢量数学功能的 Array 类。我想定义一个函数,让用户在整个数组上映射任意函数。我已经可以为预定义的二进制函数执行此操作(例如,operator+= 用于就地添加),但我正在努力了解如何针对任意数量的输入执行此操作。
template<typename T, size_t ... Ns>
class Array
{
public:
Array() { /* allocate memory of size product(Ns) * sizeof(T) */ }
~Array() { /* deallocate memory */ }
inline Array<T, Ns...>& operator+=(const Array<T, Ns...> &rhs)
{
// simple case: predefined operation on exactly two Arrays
T *p1 = data, *p2 = rhs.data;
while (p1 != data + size) { *p1 += *p2; p1++; p2++; }
return *this;
}
template<class ... Args>
inline const Array<T, Ns...> map(T (*fn)(arg_type<Args>...), Args ... args)
{
// difficult case: arbitrary operations on a variable number of Arrays
}
private:
T *data;
size_t size;
}
// example usage
double f(double a, double b) { return a + b; }
Array<double,2> x, y, z;
x.map(f, y, z);
我希望这样的东西循环遍历y 和z 中的所有元素,将f 应用于它们,并将它们存储在x 中。我以为我可以在我的 operator+= 函数上对其进行建模,但我还没有找到可以让我做任何类似事情(和编译)的参数包扩展。
【问题讨论】:
-
在它的核心,你会说类似
(data[I] = f(args[I]...))...,这应该发生在一个辅助函数模板中,它接受index_sequence<I...>和Args ...args,我想。 -
是
data始终是一维的(即Ns始终包含单个值)? -
用 T 的向量替换数据和大小。编写接受 N 个向量并在所有向量上应用函数的代码,返回结果向量。为您的数组类编写一个带有向量的构造函数。编写这些解决方案,解决您的问题(并停止浪费脑空间来管理原始指针的生命周期!)
-
for (int i = 0; i < Ns; ++i) data[i] = fn(args.data[i]...);根据描述应该足够了 -
@PiotrSkotnicki 将
i < Ns替换为i < product(Ns...)和data.resize(product(Ns...));,但基本上是的。
标签: c++ c++11 variadic-templates variadic-functions