【发布时间】:2011-07-29 12:16:32
【问题描述】:
我想知道是否有可能有某种编译时循环。
例如,我有以下模板类:
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 个参数的哈希函数(尽管我猜它的效率会更低)。因此,我对解决这个特定问题不感兴趣,而是想知道类似情况下是否存在“编译时循环”。
谢谢!
【问题讨论】:
-
我认为这不是一个好的答案,所以我只是在这里评论一下:可能编译器能够看到这些东西并对其进行优化——但我绝对不是编译器方面的专家。跨度>
-
在发帖之前,我试着放了一个循环,但它没有用 - 因此我的问题;)
-
你总是可以部分专门化你的模板,但这也不是一个好的解决方案:D
-
这是一个不寻常的程序,需要对初始化阶段进行优化。
-
@Chris:是什么让你觉得这个类只能在程序的初始化阶段使用?