C++ 对任意数量的可变参数应用函数

C++ 对任意数量的可变参数应用函数,c++,c++11,variadic-templates,variadic-functions,C++,C++11,Variadic Templates,Variadic Functions,这是我们的后续问题。我正在构建一个具有基本向量数学功能的数组类。我想定义一个函数,让用户在整个数组中映射任意函数。我已经可以对预定义的二进制函数(比如,operator+=进行就地加法)执行此操作,但我很难看到如何对任意数量的输入执行此操作 template<typename T, size_t ... Ns> class Array { public: Array() { /* allocate memory of size product(Ns) * sizeof(T)

这是我们的后续问题。我正在构建一个具有基本向量数学功能的数组类。我想定义一个函数,让用户在整个数组中映射任意函数。我已经可以对预定义的二进制函数(比如,
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);
模板
类数组
{
公众:
Array(){/*分配大小乘积(Ns)*sizeof(T)*/}
~Array(){/*释放内存*/}
内联数组和运算符+=(常量数组和rhs)
{
//简单示例:仅在两个阵列上预定义操作
T*p1=数据,*p2=rhs.数据;
而(p1!=数据+大小){*p1+=*p2;p1++;p2++;}
归还*这个;
}
模板
内联常量数组映射(T(*fn)(arg_类型…,Args…Args)
{
//疑难案例:对数量可变的数组执行任意操作
}
私人:
T*数据;
大小;
}
//示例用法
双f(双a,双b){返回a+b;}
阵列x,y,z;
x、 图(f,y,z);
我希望这样的东西能够在
y
z
中的所有元素上循环,对它们应用
f
,并将它们存储在
x
中。我想我可以在我的
操作符+=
函数上对它进行建模,但我还没有找到一个参数包扩展,可以让我做任何类似的事情(并编译)。

写以下内容:

template<class T, class Array2>
using Array_Size_Copy = // expression that creates a Array<T,???>, where ??? is the Ns... of Array2 above
模板
使用Array\u Size\u Copy=//创建数组的表达式,其中???是Ns。。。上面第2列的
然后

模板
自动数组应用(F&&F、A0&&A0、数组和…数组){
使用R=衰减t;
数组大小拷贝检索;
对于(int i=0;i
添加一些所有内容大小相同的断言(理想情况下为静态断言)

上述功能可能需要是朋友。这意味着您可能需要设置返回值,而不是使用
auto
,但这只是将类型coursics移动到声明中。

写下以下内容:

template<class T, class Array2>
using Array_Size_Copy = // expression that creates a Array<T,???>, where ??? is the Ns... of Array2 above
模板
使用Array\u Size\u Copy=//创建数组的表达式,其中???是Ns。。。上面第2列的
然后

模板
自动数组应用(F&&F、A0&&A0、数组和…数组){
使用R=衰减t;
数组大小拷贝检索;
对于(int i=0;i
添加一些所有内容大小相同的断言(理想情况下为静态断言)


上述功能可能需要是朋友。这意味着您可能必须设置返回值,而不是使用
auto
,但这只是将类型coursics移到声明中。

在其核心,您可以说类似
(data[I]=f(args[I]…)…
,这应该发生在一个助手函数模板中,该模板采用一个
index_序列
Args…Args
,我想。
数据
总是一维的(即,
Ns
总是包含一个值)?用一个T向量替换数据和大小。编写一个采用N个向量并在所有向量上应用函数的代码,返回结果的向量。为arrray类编写一个构造函数,该类采用向量。为(inti=0;i应满足以下条件:description@PiotrSkotnicki将
i
替换为
i
)和
data.resize(product(Ns…),但本质上是。在它的核心,你会说一些类似于
(data[I]=f(args[I]…)…
,这应该发生在一个助手函数模板中,该模板采用
索引序列和
args…args
,我想。
数据总是一维的(即
Ns
总是包含一个值)?用T向量替换数据和大小。编写代码,获取N个向量,并在所有向量上应用函数,返回结果向量。为arrray类编写一个构造函数,该类采用向量。为(inti=0;i应满足以下条件:description@PiotrSkotnicki将
i
替换为
i
)和
data.resize(product(Ns…),但本质上是。