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;ii
替换为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…)代码>,但本质上是。