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

以编译方式在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编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法。


慕无忌1623718
浏览 549回答 3
3回答

SMILET

您可以获得的最接近的是使用C ++ 0x功能从可变参数模板参数列表初始化模板的本地或成员数组。这当然受到最大模板实例化深度的限制,并且必须测量实际上在您的情况下显着差异。例:template<unsigned... args> struct ArrayHolder {&nbsp; &nbsp; static const unsigned data[sizeof...(args)];};template<unsigned... args>&nbsp;const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };template<size_t N, template<size_t> class F, unsigned... args>&nbsp;struct generate_array_impl {&nbsp; &nbsp; typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;};template<template<size_t> class F, unsigned... args>&nbsp;struct generate_array_impl<0, F, args...> {&nbsp; &nbsp; typedef ArrayHolder<F<0>::value, args...> result;};template<size_t N, template<size_t> class F>&nbsp;struct generate_array {&nbsp; &nbsp; typedef typename generate_array_impl<N-1, F>::result result;};适用于您的1..5情况:template<size_t index> struct MetaFunc {&nbsp;&nbsp; &nbsp; enum { value = index + 1 };&nbsp;};void test() {&nbsp; &nbsp; const size_t count = 5;&nbsp; &nbsp; typedef generate_array<count, MetaFunc>::result A;&nbsp; &nbsp; for (size_t i=0; i<count; ++i)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; std::cout << A::data[i] << "\n";}

弑天下

那么你的要求是如此模糊,很难对它们采取任何行动......主要问题当然是:这些价值来自哪里?无论如何,C ++中的构建可以被认为是4个步骤:预构建步骤:从其他格式生成头/源的脚本预处理模板实例化编译正确如果您希望排除脚本生成,那么您将有两种选择:预处理和元模板编程。我不知道元模板编程在这里可以做到这一点,因为据我所知,在编译时不可能连接两个数组。因此,我们留下了当时的救星:预处理程序编程我建议使用一个完整的库来帮助我们:Boost.Preprocessor。特别感兴趣的是:BOOST_PP_FORBOOST_PP_REPEAT现在,只要我们知道从哪里挑选价值,我们就可以给出更有意义的例子。

慕虎7371278

如何使用模板构建嵌套结构,并将其转换为正确类型的数组。下面的例子适用于我,但我有一种感觉,我要么正在踩踏,要么走得非常接近未定义的行为。#include <iostream>template<int N>struct NestedStruct{&nbsp; NestedStruct<N-1> contained;&nbsp; int i;&nbsp; NestedStruct<N>() : i(N) {}};template<>struct NestedStruct<0>&nbsp;{&nbsp; int i;&nbsp; NestedStruct<0>() : i(0) {}};int main(){&nbsp; NestedStruct<10> f;&nbsp; int *array = reinterpret_cast<int*>(&f);&nbsp; for(unsigned int i=0;i<10;++i)&nbsp; {&nbsp; &nbsp; std::cout<<array[i]<<std::endl;&nbsp; }}当然你可能会争辩说数组在编译时没有初始化(我认为这是不可能的)但是进入数组的值是在编译时计算的,你可以像普通数组那样访问它们。我认为那是你能得到的尽可能接近的。
打开App,查看更多内容
随时随地看视频慕课网APP