gpt4 book ai didi

c++ - 编译时循环

转载 作者:IT老高 更新时间:2023-10-28 12:59:13 27 4
gpt4 key购买 nike

我想知道是否有可能有某种编译时循环。
例如,我有以下模板类:

template<class C, int T=10, int B=10>
class CountSketch
{
public:
CountSketch()
{
hashfuncs[0] = &CountSketch<C>::hash<0>;
hashfuncs[1] = &CountSketch<C>::hash<1>;
// ... for all i until i==T which is known at compile time
};
private:
template<int offset>
size_t hash(C &c)
{
return (reinterpret_cast<int>(&c)+offset)%B;
}
size_t (CountSketch::*hashfuncs[T])(C &c);
};

因此我想知道是否可以使用循环执行循环来初始化 T 哈希函数。循环的边界在编译时是已知的,因此,原则上,我看不出它有任何无法完成的原因(特别是因为如果我手动展开循环它可以工作)。

当然,在这个特定的示例中,我可以只创建一个带有 2 个参数的哈希函数(尽管我猜它的效率会更低)。因此,我对解决这个特定问题不感兴趣,而是想知道类似情况下是否存在“编译时循环”。

谢谢!

最佳答案

不,这不是直接可能的。模板元编程是一种纯函数式语言。通过它定义的每个值或类型都是不可变的。循环本质上需要可变变量(重复测试某些条件直到 X 发生,然后退出循环)。

相反,您通常会依赖递归。 (每次都用不同的模板参数实例化这个模板,直到达到某个终止条件)。

但是,这可以解决所有与循环相同的问题。

编辑:这是一个简单的示例,在编译时使用递归计算 N 的阶乘:

template <int N>
struct fac {
enum { value = N * fac<N-1>::value };
};

template <>
struct fac<0> {
enum { value = 1 };
};

int main() {
assert(fac<4>::value == 24);
}

C++ 中的模板元编程是图灵完备的语言,所以只要不遇到各种内部编译器限制,基本上可以解决任何问题。

但是,出于实际目的,可能值得研究 Boost.MPL 等库,其中包含大量数据结构和算法,可简化大量元编程任务。

关于c++ - 编译时循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6872919/

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