大家好
有些简单而且固定的运算,我想透过 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 实在不熟,希望有大大可以指点
谢谢大家