傳統上,C 語言中的靜態陣列可以在編譯時使用fixed-定義大小數組。然而,對於某些情況,可能需要在編譯時以程式方式分配值。本文探討了實現靜態數組動態創建的元編程技術。
使用 C 0x 功能,可以從範本初始化本機或成員陣列可變參數範本參數清單。由於最大模板實例化深度,此解決方法有其限制。
要在編譯時選擇性賦值,可以採用可變參數模板和元函數的組合。 MetaFunc 範本可作為參數包,根據其索引產生一系列值。然後,generate_array 範本可以使用產生的值來建立所需大小的陣列。
template<size_t index> struct MetaFunc { enum { value = index + 1 }; }; template<size_t N, template<size_t> class F> struct generate_array { typedef typename generate_array_impl<N-1, F>::result result; }; 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<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
void test() { const size_t count = 5; typedef generate_array<count, MetaFunc>::result A; for (size_t i = 0; i < count; ++i) std::cout << A::data[i] << "\n"; }
此範例定義了一個靜態大小為5 的陣列,在編譯時使用MetaFunc 分配值{1, 2, 3, 4, 5}元函數。
以上是C 元程式設計可以用來動態建立編譯時靜態陣列嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!