为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕无忌1623718 2019-08-30 16:56:04
以编译方式在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编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法。
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您可以获得的最接近的是使用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<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";

}


查看完整回答
反对 回复 2019-08-30
?
弑天下

TA贡献1818条经验 获得超8个赞

那么你的要求是如此模糊,很难对它们采取任何行动......主要问题当然是:这些价值来自哪里?


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


预构建步骤:从其他格式生成头/源的脚本

预处理

模板实例化

编译正确

如果您希望排除脚本生成,那么您将有两种选择:预处理和元模板编程。


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


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


特别感兴趣的是:


BOOST_PP_FOR

BOOST_PP_REPEAT

现在,只要我们知道从哪里挑选价值,我们就可以给出更有意义的例子。


查看完整回答
反对 回复 2019-08-30
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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


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

  }

}

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


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 548 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信