Re: [問題] compile time array initialization?

看板C_and_CPP (C/C++)作者 (のヮの)時間11年前 (2014/11/11 23:00), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
自己回一下 後來找到這篇 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 實在不熟,希望有大大可以指點 : 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.22.50 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1415718032.A.CE6.html
文章代碼(AID): #1KOYIGpc (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1KOYIGpc (C_and_CPP)