大家好
有些簡單而且固定的運算,我想透過 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 實在不熟,希望有大大可以指點
謝謝大家