开发者社区> 问答> 正文

在C ++中以编程方式在创建时创建静态数组

可以在编译时定义静态数组,如下所示:

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

展开
收起
保持可爱mmm 2020-02-09 13:25:54 478 0
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... };

    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";
    

    }

    2020-02-09 13:26:08
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载