gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:20:31 24 4
gpt4 key购买 nike

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

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 };
  1. 欢迎使用 C++0x 的解决方案
  2. 数组可能很大,很少一百个元素长
  3. 目前的数组将只包含POD 类型
  4. 也可以假设大小为数组将是预先知道的,在静态编译时兼容方式。
  5. 解决方案必须使用 C++ (无脚本、无宏、无 pp或基于代码生成器的解决方案)

更新: Georg Fritzsche 的解决方案非常棒,需要一些工作才能使其在 msvc 和 intel 编译器上编译,但仍然是一种非常有趣的解决问题的方法。

最佳答案

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

关于c++ - 在 C++ 中以编程方式在编译时创建静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com