在C 編譯時以程式方式產生靜態數組
鑑於能夠在C 編譯時定義靜態數組,是否可以使用元程式設計技術以程式方式分配它們的值?
問題1:陣列值的程式賦值
是的,使用C 0x特性,在編譯時「以程式設計方式」初始化陣列元素是可行的。考慮以下範例:
1 2 3 4 5 6 7 | template<unsigned... args>
struct ArrayHolder {
static const unsigned data[sizeof...(args)];
};
template<unsigned... args>
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
|
登入後複製
問題2:陣列值的選擇性賦值
假設陣列包含重複出現的值(但有些例外),則可以選擇性地賦值以程式設計方式值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | template<size_t N, template<size_t> class F, unsigned... args>
struct generate_array_impl {
typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};
template<template<size_t> class F, unsigned... args>
struct generate_array_impl<0, F, args...> {
typedef ArrayHolder<F<0>::value, args...> result;
};
template<size_t N, template<size_t> class F>
struct generate_array {
typedef typename generate_array_impl<N-1, F>::result result;
};
|
登入後複製
具有重複零的陣列的用法除了元素2 和3:
1 2 3 4 5 6 7 8 9 10 11 12 | template<size_t index>
struct MetaFunc {
enum { value = index == 2 || index == 3 ? index + 1 : 0 };
};
void test() {
const size_t count = 7;
typedef generate_array< count , MetaFunc>::result A;
for (size_t i=0; i< count ; ++i)
std::cout << A::data[i] << "\n" ;
}
|
登入後複製
雖然這些解決方案受到最大模板實例化深度的限制,但它們展示了 C 0x 在編程數組創建和初始化方面的潛力。
以上是C 0x 元程式設計技術可以用於在編譯時以程式設計方式將值指派給靜態陣列嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!