可以在编译时定义静态数组,如下所示:
const std::size_t size = 5;
unsigned int list[size] = { 1, 2, 3, 4, 5 }; 问题1-是否可以通过使用各种元编程技术在编译时“以编程方式”分配这些值?
问题2-假设数组中的所有值都是相同的几个,是否有可能在编译时以编程方式有选择地分配值?
例如:
const std::size_t size = 7;
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 }; 欢迎使用C ++ 0x解决方案 数组可能很大,只有几百个元素 现在的数组仅由POD类型组成 还可以假定以静态编译时兼容方式预先知道数组的大小。 解决方案必须使用C ++ (没有脚本,没有宏,没有pp或基于代码生成器的解决方案pls) 更新: Georg Fritzsche的解决方案非常出色,需要一些工作才能使其在msvc和intel编译器上进行编译,但是仍然是解决该问题的一种非常有趣的方法。 问题来源于stack overflow
您可以获得的最接近的结果是使用C ++ 0x功能从可变参数模板参数列表中初始化模板的本地或成员数组。 当然,这受最大模板实例化深度的限制,并且在实际情况下,还必须对它们产生显着影响。
例:
template<unsigned... args> struct ArrayHolder { static const unsigned data[sizeof...(args)]; };
template<unsigned... args> const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };
template<size_t N, template<size_t> class F, unsigned... args> struct generate_array_impl { typedef typename generate_array_impl<N-1, F, F ::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; }; 您的1..5情况的用法:
template<size_t index> struct MetaFunc { enum { value = index + 1 }; };
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";
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。