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

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

const std::size_t size = 5;    
unsigned int list[size] = { 1, 2, 3, 4, 5 };

问题1 - 是否可以通过使用各种元编程技术在编译时“编程”分配这些值?

问题2 - 假设数组中的所有值都是相同的barr,是否可以在编译时以编程方式有选择地分配值?

例如:

const std::size_t size = 7;        
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
  • 欢迎使用C ++ 0x的解决方案
  • 阵列可能相当大,只有几百个元素
  • 现在的数组将只包含POD类型
  • 也可以假定数组的大小将以静态编译时兼容的方式预先知道。
  • 解决方案必须使用C ++ (无脚本,无宏,无pp或代码生成器的解决方案)
  • 更新: Georg Fritzsche的解决方案非常出色,需要一点工作才能在msvc和intel编译器上编译,但仍然是一个非常有趣的解决方案。


    您可以得到最接近的是使用C ++ 0x功能从variadic模板参数列表中初始化模板的本地或成员数组。
    这当然受到最大模板实例化深度的限制,而实际上在您的情况下会产生显着差异的模板将不得不被测量。

    例:

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

    用于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";
    }
    

    那么你的要求太模糊了,很难对它们做任何事情......主要问题是:这些价值从何而来?

    无论如何,C ++中的构建可以被认为是4个步骤:

  • 预生成步骤:从其他格式生成头文件/源文件
  • 预处理
  • 模板实例
  • 编译正确
  • 如果你想排除脚本生成,那么你剩下2个选择:预处理和元模板编程。

    我不知道元模板编程在这里做的窍门,因为据我所知,在编译时不可能连接两个数组。 因此,我们留下了一天的救星: 预处理器编程

    我建议使用一个完整的库来帮助我们:Boost.Preprocessor。

    这里特别感兴趣的是:

  • BOOST_PP_FOR
  • BOOST_PP_REPEAT
  • 现在,只要我们知道从哪里选择价值,我们就可以提供更有意义的例子。


    如何使用模板构建嵌套结构,并将其转换为正确类型的数组。 下面的例子适用于我,但是我有一种感觉,我要么行走,要么步行非常接近未定义的行为。

    #include <iostream>
    
    template<int N>
    struct NestedStruct
    {
      NestedStruct<N-1> contained;
      int i;
      NestedStruct<N>() : i(N) {}
    };
    
    template<>
    struct NestedStruct<0> 
    {
      int i;
      NestedStruct<0>() : i(0) {}
    };
    
    int main()
    {
      NestedStruct<10> f;
      int *array = reinterpret_cast<int*>(&f);
      for(unsigned int i=0;i<10;++i)
      {
        std::cout<<array[i]<<std::endl;
      }
    }
    

    当然你可以争辩说数组在编译时没有被初始化(我认为这是不可能的),但是数组中的值是在编译时计算出来的,你可以像访问普通数组一样访问它们。我认为这是尽可能接近的。

    链接地址: http://www.djcxy.com/p/62689.html

    上一篇: Programmatically create static arrays at compile time in C++

    下一篇: C++0x initializer list example