如何从 std::integer_sequence 初始化静态数组?

2024-01-11

我为枚举制作了一个符合以下规则的可迭代生成器:

  • Enum 是一个整数序列,没有间隙
  • 给定枚举的最后一个元素不是实际的枚举元素

该类看起来像这样:

template <typename EnumType, EnumType LENGTH>
class EnumArrayNonStatic
{
public:
  using ValueType = typename std::underlying_type<EnumType>::type;
  //! Initialize values via private constructor
  constexpr EnumArrayNonStatic() : EnumArrayNonStatic(std::make_integer_sequence<ValueType, (ValueType)LENGTH>{}) {}

  //! All values generated via std::integer_sequence
  EnumType values[(int)LENGTH];
private:
  //! Private constructor that populates values
  template <int... Indices>
  constexpr EnumArrayNonStatic(std::integer_sequence<int, Indices...>) : values{(static_cast<EnumType>(Indices))...} {}
};

Usage:

enum class TestEnum
{
  A,
  B,
  C,
  D,
  LENGTH
};
int main()
{
  for (const TestEnum val : EnumArrayNonStatic<TestEnum, TestEnum::LENGTH>().values)
  {
    std::cout << (int)val << "\n";
  }
  return 0;
}

但是,我希望能够使用EnumArray<TestEnum, TestEnum::LENGTH>::values并在编译期间通过模板生成值。我写了这个:

template <typename EnumType, EnumType LENGTH>
class EnumArray
{
private:
  using ValueType = typename std::underlying_type<EnumType>::type;
  //! Static generator of value array (returns EnumType[])
  template <ValueType... Indices>
  static constexpr auto GenerateArray(std::integer_sequence<ValueType, Indices...>) { return {(static_cast<EnumType>(Indices))...}; }
public:
  //! Static array of values of an enum
  static constexpr EnumType values[static_cast<ValueType>(LENGTH)] = GenerateArray(std::make_integer_sequence<ValueType, static_cast<ValueType>(LENGTH) >{});
};

我已经搞乱了代码有一段时间了,但我总是不断收到错误。上面的版本打印:

1>enumiteratortest.cpp(22): error C3108: cannot deduce a type as an initializer list is not an expression
1>enumiteratortest.cpp(25): note: see reference to function template instantiation 'auto EnumArray<TestEnum,TestEnum::LENGTH>::GenerateArray<0,1,2,3>(std::integer_sequence<int,0,1,2,3>)' being compiled
1>enumiteratortest.cpp(52): note: see reference to class template instantiation 'EnumArray<TestEnum,TestEnum::LENGTH>' being compiled
1>enumiteratortest.cpp(22): error C2440: 'return': cannot convert from 'initializer list' to 'auto'
1>enumiteratortest.cpp(22): note: There is no context in which this conversion is possible
1>enumiteratortest.cpp(25): error C2440: 'initializing': cannot convert from 'void' to 'const EnumType [4]'
1>        with
1>        [
1>            EnumType=TestEnum
1>        ]
1>enumiteratortest.cpp(25): note: There are no conversions to array types, although there are conversions to references or pointers to arrays

当然必须有一种方法来静态初始化数组。是个GenerateArray甚至有必要吗?难道就没有办法做到这一点吗?

int myArray[] = std::integer_sequence<ValueType, Indices...>{Indices...}

或者类似的东西?


您不能使用以下方式初始化语言数组initializer_list。而且,您不能将该函数的返回类型更改为数组 - 函数不能返回数组。

只需将一切更改为std::array:

template <ValueType... Indices>
static constexpr auto GenerateArray(std::integer_sequence<ValueType, Indices...>)
    -> std::array<EnumType, sizeof...(Indices)>
{
    return {(static_cast<EnumType>(Indices))...};
}

static constexpr std::array<EnumType,  static_cast<ValueType>(LENGTH)> values
      = GenerateArray(std::make_integer_sequence<ValueType, static_cast<ValueType>(LENGTH)>{});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 std::integer_sequence 初始化静态数组? 的相关文章

随机推荐

  • event.target 在事件中未定义

    一个人如何使用each输入值events 希望我的下面的代码能很好地解释你 HTML
  • Pandas - 将分类列转换为二进制编码形式

    我有一个数据集 看起来像这样 yyyy month tmax tmin 0 1908 January 5 0 1 4 1 1908 February 7 3 1 9 2 1908 March 6 2 0 3 3 1908 April 7 4
  • 如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

    USER ID string col 100001 Here 100001 there 100001 Apple 200002 this is 200002 that is 200002 Apple 200002 Cell 4 这是我的原始
  • 继续黑屏。以前从未见过这个

    我正在 Xcode 5 0 2 中为 iOS7 制作一个演示 并连接了一些场景并有一些按钮 一些视图控制器类和一些转场 没什么不寻常的 我以前从未见过的是 在某些构建上 当执行转场时 下一个视图控制器在推送后会间歇性地全黑 但并非总是如此
  • Laravel 5.3 安装错误

    我正在尝试启动本地托管在我的浏览器上的 laravel 但它给了我以下错误 解析错误 语法错误 意外的 期望 或变量 T VARIABLE 在 opt lampp htdocs projects larawiz vendor laravel
  • [if lt IE 9] 的 Slim 模板引擎语法

    我使用 slim 作为视图模板引擎http slim lang com http slim lang com 你会如何用 slim 编写下面的代码 thanks 应该使用 if lt IE 9 gt
  • 从字符串中提取Python字典

    我有一个字符串 里面有有效的 python 字典 data Some string created Foo u 1002803 Bar value string continue etc 我需要提取该字典 我尝试使用正则表达式 但由于某种原
  • 如何在 C 中访问(动态分配的)Fortran 数组

    我的主要问题是为什么数组会做如此奇怪的事情 以及是否有任何方法可以以 干净 的方式执行以下操作 我目前有一个C程序foo c连接 Fortran 程序bar f90 via dlopen dlsym 大致如下面的代码所示 foo c inc
  • 无法连接到远程服务器上的mongo

    我已经在machine1上安装了mongo Ubuntu 14 04 3 LTS server 在我的本地网络中 我也打开了端口27017如中提到的this https docs mongodb org manual tutorial co
  • android 卸载应用程序后保留数据库

    我正在开发 sq lite 数据库 可以在其中找到三星设备中的问题 当我卸载应用程序时 Android 操作系统会保留导致数据库版本冲突的数据库 以前我使用版本 2 现在我使用版本 1 作为参数sqllitehelper构造函数 按照惯例
  • Tensorflow.js 加载增强层操作时出错

    我通过 python 中的张量流训练了一个模型 使用将图像增强合并到模型层中 但是 当我将训练好的模型转换为tensorflow js model json 并运行它时 出现错误 jquery 3 3 1 slim min js 2 Unc
  • 如何在 Zend Framework 中创建 Web 服务?

    如何使用 Zend Framework 通过 HTTP REST 协议创建 Web 服务 示例代码将会很有用 要调用此 Web 服务 请使用以下参数打开保存此 PHP 文件的 URL 这将给出输出 Hello world Test
  • 使用 FineUploader 向 Amazon S3 提供标头

    我正在使用 FineUploader 将文件上传到 Amazon S3 我想添加Content Disposition文件头 我已经尝试过这个 在 CoffeeScript 中 request endpoint accessKey cust
  • 拨号 tcp 查找:docker windows 桌面上没有此类主机问题

    我已经在我的办公室 Windows 10 Pro 机器上安装了 docker 我在尝试从注册表中提取数据时遇到拨号 tcp 查找问题 来自守护进程的错误响应 获取https registry 1 docker io v2 https reg
  • 如何在 C# 中使用 p/invoke 将指针传递给数组?

    C API 签名示例 void Func unsigned char bytes 在 C 中 当我想将指针传递给数组时 我可以这样做 unsigned char bytes new unsigned char 1000 Func bytes
  • Azure CLI aks install cli 权限被拒绝并且 sudo 不起作用

    我正在尝试奔跑az aks install cli但我收到一条错误消息 Downloading client to usr local bin kubectl from https storage googleapis com kubern
  • 正则表达式:捕获捕获组内的捕获组

    Intro 您可以跳至如果什么 如果您对介绍感到厌倦 这个问题并不是特别针对VBScript 我只是在这种情况下使用它 我想找到一个用于一般正则表达式使用 包括编辑器 的解决方案 当我想创作一个改编版时 这一切就开始了示例 4 其中使用 3
  • Django:自定义序列化选项?

    我正在开发一个基于 Django 的 Web 服务 并且正在尝试找出进行序列化的最佳方法 然而 棘手的要求是我希望对响应的格式和包含的字段有几乎完全的控制 例如 Django 序列化器 不幸的是 它包括wadofstuff 序列化器 htt
  • 未定义的方法“空白?”对于“123”:字符串(NoMethodError)

    当我检查 ruby 中的类变量时 我收到这个奇怪的错误 未定义的方法 空白 对于 123 字符串 NoMethodError 我所做的就是Employee set id blank 有什么想法为什么会发生这种情况吗 Thanks The b
  • 如何从 std::integer_sequence 初始化静态数组?

    我为枚举制作了一个符合以下规则的可迭代生成器 Enum 是一个整数序列 没有间隙 给定枚举的最后一个元素不是实际的枚举元素 该类看起来像这样 template