Re: [問題] compile time array initialization?

作者: holydc (のヮの)   2014-11-11 23:00:24
自己回一下
後來找到這篇 http://goo.gl/HwKtMA
( http://www.macieira.org/blog/2011/07/
initialising-an-array-with-cx0x-using-constexpr-and-variadic-templates/ )
依照他的做法,從一個 template 參數 N 產生一串 0 ... (N - 1) 的參數
然後把這串丟到我一開始希望的
template<unsigned int... N>
struct Values {
static const unsigned int values[sizeof...(N)];
};
template<unsigned int... N>
const unsigned int Values<N...>::values[sizeof...(N)] = {
N...
};
搭配原本的 PowerOfTen,於是得到 http://ideone.com/sAlBJg
這樣是否算是將執行時間降到最低了呢??
※ 引述《holydc (のヮの)》之銘言:
: 大家好
: 有些簡單而且固定的運算,我想透過 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 實在不熟,希望有大大可以指點
: 謝謝大家

Links booklink

Contact Us: admin [ a t ] ucptt.com