自己回一下
后来找到这篇 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 实在不熟,希望有大大可以指点
: 谢谢大家