[問題] 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