gpt4 book ai didi

c++ - 我如何使用元编程 C++ 展开循环?

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:25 25 4
gpt4 key购买 nike

事实上,我想计算 2 个数组的点积。当我尝试这个时

template <int N, typename ValueType>
struct ScalarProduct {
static ValueType product (ValueType* first, ValueType* second) {
return ScalarProduct<N-1, ValueType>::product(first + 1, second + 1)
+ *first * *second;
}
};

template <typename ValueType>
struct ScalarProduct<0, ValueType> {
static ValueType product (ValueType* first, ValueType* second) {
return 0;
}

然后在运行时计算的时间比编译期间少

最佳答案

首先,您正在编写函数。不管元编程与否,编译器都会生成函数。而且由于直到运行时才会评估函数,因此您的方法不会减少运行时间。事实上,当您将 for 循环展开到递归函数调用中时,它可能会增加一些开销。

要回答一个更一般的问题,使用模板元编程,您只能在编译时 计算内容。一种标准方法是预先计算所需的值并将它们作为成员存储在对象中。而且您只能使用像枚举这样的类型(不需要构造函数的类型)在编译时计算内容,因为所有构造函数调用都是在运行时执行的。

在大多数情况下,元编程是不切实际的。您可以将它用作了解模板的好工具,但它会导致大型二进制文件和不可维护的代码库。因此,我建议您不要使用它,除非您探索了其他选项(例如查找表)。

您只能使用已经在您的代码中定义的任意数组。例如

int a1[] = {1,2,3};
int a2[] = {2,4,5};

template <int N,typename T>
struct foo {
int product;
foo<N-1,T> rest;
foo(const T* array1,const T* array2) : rest(array1+1,array2+1) { product = array1[0] * array2[0] + rest.product; }
};

template <0,typename T>
struct foo {
int product;
// These addresses are stale, so don't use them
foo(cons T* array1, const T* array2) : product(0) {}
};

foo<3,int> myfoo(a1,a2);

并且您可以让 myfoo.product 获取编译时计算的 a1 和 a2 的叉积值。

关于c++ - 我如何使用元编程 C++ 展开循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com