[问题] compile time array initialization?

楼主: holydc (のヮの)   2014-11-11 17:24:41
大家好
有些简单而且固定的运算,我想透过 template 递回在编译期算出值,例如
template<unsigned int N>
struct PowerOfTen {
static_assert(N < 20U, "Too large");
constexpr static const unsigned long long value =
10ULL * PowerOfTen<N - 1U>::value;
};
template<>
struct PowerOfTen<0U> {
constexpr static const unsigned long long value = 1ULL;
};
但是执行期我需要透过变量来取得这些值,例如
for (unsigned int i = 2; i < 7; ++i) {
std::cout << PowerOfTen<i>::value; // error
}
所以我是不是该建立一张表存放这些值,使用时会像
for (unsigned int i = 2; i < 7; ++i) {
std::cout << PowerOfTenTable::value[i];
}
我想到的方法大概是
template<unsigned int N>
const unsigned long long PowerOfTen<N>::value = init() {
static const unsigned long long val =
10ULL * PowerOfTen<N - 1>::value;
PowerOfTenTable::value[N] = val;
return val;
}
这我没有实际编译并执行过所以不晓得对不对
因为我觉得这样写就变成在模组加载时建表而非编译期,仍然会占用执行时间
不晓得我的观念是否正确,并且想请问有无解法
另外是不是可以用 variadic template 达到这个效果
只不过我跟 variadic template 实在不熟,希望有大大可以指点
谢谢大家
作者: azureblaze (AzureBlaze)   2014-11-11 18:12:00
作者: AstralBrain   2014-11-12 00:42:00
我比较推用boost.preprocessor做boost会帮处理掉恶心的实作细节, 让自己的code看起来比较干净 XD
楼主: holydc (のヮの)   2014-11-12 14:57:00
自己做过之后真的满丑的... XD
作者: dirkc (3781615)   2014-11-13 09:46:00
偶尔(只是偶尔)我会想直接放magic number会不会更有效率

Links booklink

Contact Us: admin [ a t ] ucptt.com