在 C 编译时以编程方式生成静态数组
鉴于能够在 C 编译时定义静态数组,是否可以使用元编程技术以编程方式分配它们的值?
问题1:数组值的编程赋值
是的,使用C 0x特性,在编译时“以编程方式”初始化数组元素是可行的。考虑以下示例:
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; }; template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
问题 2:数组值的选择性赋值
假设数组包含重复出现的值(但有一些例外),则可以选择性地赋值以编程方式值:
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:
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中文网其他相关文章!