使用std :: index_sequence初始化具有固定大小数组成员的POD结构容器

johnco3

我正在尝试使用std::integer_sequence其辅助模板std::index_sequence来初始化行为类似于容器的固定大小的POD结构。每个元素依次包含一个固定大小的数组字段。

容器POD结构基本上定义为:

#define ELEM_NAME_SIZE   7
#define CONTAINER_SIZE  20

using Container = struct Container {
    int entries;
    Element elems[MAX_CONTAINER_SIZE];    
};

各个元素是:

using Element = struct Element {
    char name[MAX_NAME_CHARS];
    bool bFlag;
};

在回答号楼的问题,我能使用std::index_sequence初始化固定长度Element秒。到现在为止还挺好。

我需要想出一种方法来构造Container具有单个固定大小的const char*-说“ ABCDEF”,或者具有固定长度的数组(最多ELEM_NAME_SIZE)的字符串。

constexpr char gTestNames[3][ELEM_NAME_SIZE] = {
    "APPLE", "BEE", "CHAIN"
};

实时coliru代码中,这些容器构造函数中的第一个如下:

template<std::size_t N, typename Indices = std::make_index_sequence<N>>
constexpr Container makeContainer(char const (&name)[N]) {
    return makeContainer_in(name, Indices{});
}

以这种方式构造并打印出容器的内容:

const auto container = makeContainer("ABCDEF");
std::cout << container << '\n';

输出:

Container: entries(7)[Element:[ABCDEF],,Element:[],,Element:[],,Element:[],,Element:[],,Element:[],,Element:[],,]

但是,使用带有参数的备用模板函数重载gTestNames

template<std::size_t N, std::size_t NAME_LEN_MAX = ELEM_NAME_SIZE, typename Indices = std::make_index_sequence<N>>
constexpr Container makeContainer(const char(&names)[N][NAME_LEN_MAX]) {
    return makeContainer_in(names, Indices{});
}

调用使用:

const auto container1 = makeContainer(gTestNames);
std::cout << container1 << '\n';;

我得到以下错误输出:

main.cpp: In instantiation of 'constexpr Container makeContainer(const char (&)[N][NAME_LEN_MAX]) [with long unsigned int N = 3; long unsigned int NAME_LEN_MAX = 7; Indices = std::integer_sequence<long unsigned int, 0, 1, 2>; Container = Container]':
main.cpp:78:53:   required from here
main.cpp:64:28: error: no matching function for call to 'makeContainer_in(const char [3][7], std::integer_sequence<long unsigned int, 0, 1, 2>)'
   64 |     return makeContainer_in(names, Indices{});
      |            ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
main.cpp:52:21: note: candidate: 'template<long unsigned int N, long unsigned int ...Is> constexpr Container makeContainer_in(const char (&)[N], std::index_sequence<Is ...>)'
   52 | constexpr Container makeContainer_in(char const (&packed)[N], std::index_sequence<Is...>) {
      |                     ^~~~~~~~~~~~~~~~
main.cpp:52:21: note:   template argument deduction/substitution failed:
main.cpp:64:28: note:   mismatched types 'const char' and 'const char [7]'
   64 |     return makeContainer_in(names, Indices{});
      |            ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~

如果可能,除了纠正我的错误外,还有什么方法可以简化所有这些样板代码-也许使用fold表达式-我想使用index_sequences(因为我正在尝试学习如何使用它们),但是我从来没有了解始终将呼叫转发给某种代理以扩展索引的要求。必须有一个更简单的方法。

不可预知的公主

如果要在给定输出之后输出 HELLO

 Element:[H], Element:[E], Element:[L], Element:[L], Element:[O],

该代码将起作用,尽管如果传递以null结尾的字符串,则将有一个用于null字符的元素。

#include <iostream>
#include <tuple>

#define MAX_NAME_CHARS 9
#define MAX_CONTAINER_SIZE 100

struct Element {
    char name[MAX_NAME_CHARS];
    bool bFlag;
    int foo;
    friend std::ostream& operator << (std::ostream& os, const Element& next) {
        os << next.name;
        return os;
    }    
};

struct Container {
    int entries;
    Element elems[MAX_CONTAINER_SIZE];    
    friend std::ostream& operator << (std::ostream& os, const Container& next) {        
            os << "Container: entries(" << next.entries << ")[";
            for (auto i = 0; i<next.entries; ++i) {
                os << next.elems[i] << ",";
            }
            os << "]\n";
            return os;
    } 
};

template<std::size_t N, std::size_t ... I>
constexpr Container makeContainerInSingle(const char(&singlecharnames)[N],
                                 std::index_sequence<I...>) {
    auto result = Container {
        N,
        {Element{
            {singlecharnames[I]},
            true, 
            0}...
        }
    };
    return result;
}

template<std::size_t N>
constexpr Container makeContainerSingle(const char(&singlecharnames)[N]) {
    return makeContainerInSingle(singlecharnames, std::make_index_sequence<N>{});
}

int main() {
    auto c2 = makeContainerSingle("HELLO");
    std::cout << c2 << std::endl;
}

输出如下

Container: entries(6)[H,E,L,L,O,,]

作为补充说明,我不确定如果使用std::index_sequence索引序列可以像我的示例代码中那样直接构造索引,可以做什么来简化该模式,尽管可以这样做

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

来自分类Dev

使用std :: index_sequence进行std :: array初始化的包扩展

来自分类Dev

没有初始化的C ++数组成员

来自分类Dev

使用sizeof的恒定大小数组初始化

来自分类Dev

如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

来自分类Dev

如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

来自分类Dev

在成员初始化列表中使用std :: function

来自分类Dev

如何使用成员函数初始化`std :: function`?

来自分类Dev

如何使用可变长度序列容器的内容初始化结构内部的std :: array字段?

来自分类Dev

仅使用容器初始化 std::priority_queue

来自分类Dev

使用std :: vector <unsigned char>的内容初始化结构

来自分类Dev

使用std :: vector的std :: map初始化

来自分类Dev

使用std :: vector的std :: map初始化

来自分类Dev

初始化并使用C ++ std :: string作为char数组

来自分类Dev

如何使用默认值初始化固定长度的std:pair的std :: vector?

来自分类Dev

如何使用默认值初始化固定长度的std:pair的std :: vector?

来自分类Dev

使用指针到达数组成员

来自分类Dev

使用数组并在结构中分配内存(灵活的数组成员)

来自分类Dev

使用初始化列表初始化结构,对于 std::array 失败

来自分类Dev

C ++中类数组成员的初始化

来自分类Dev

数组成员的初始化程序无效

来自分类Dev

具有std :: enable_if_t的模板类,静态const成员初始化

来自分类Dev

使用聚合初始化和成员初始化程序初始化结构

来自分类Dev

使用strcpy()对结构的char数组成员进行分段错误

来自分类Dev

使用strcpy()对结构的char数组成员进行分段错误

来自分类Dev

如何在不创建构造函数的情况下使用私有/受保护成员初始化POD结构?

来自分类Dev

使用结构初始化哈希数组

来自分类Dev

使用结构体初始化数组

来自分类Dev

为什么灵活数组成员的静态初始化有效?

Related 相关文章

  1. 1

    为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

  2. 2

    使用std :: index_sequence进行std :: array初始化的包扩展

  3. 3

    没有初始化的C ++数组成员

  4. 4

    使用sizeof的恒定大小数组初始化

  5. 5

    如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

  6. 6

    如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

  7. 7

    在成员初始化列表中使用std :: function

  8. 8

    如何使用成员函数初始化`std :: function`?

  9. 9

    如何使用可变长度序列容器的内容初始化结构内部的std :: array字段?

  10. 10

    仅使用容器初始化 std::priority_queue

  11. 11

    使用std :: vector <unsigned char>的内容初始化结构

  12. 12

    使用std :: vector的std :: map初始化

  13. 13

    使用std :: vector的std :: map初始化

  14. 14

    初始化并使用C ++ std :: string作为char数组

  15. 15

    如何使用默认值初始化固定长度的std:pair的std :: vector?

  16. 16

    如何使用默认值初始化固定长度的std:pair的std :: vector?

  17. 17

    使用指针到达数组成员

  18. 18

    使用数组并在结构中分配内存(灵活的数组成员)

  19. 19

    使用初始化列表初始化结构,对于 std::array 失败

  20. 20

    C ++中类数组成员的初始化

  21. 21

    数组成员的初始化程序无效

  22. 22

    具有std :: enable_if_t的模板类,静态const成员初始化

  23. 23

    使用聚合初始化和成员初始化程序初始化结构

  24. 24

    使用strcpy()对结构的char数组成员进行分段错误

  25. 25

    使用strcpy()对结构的char数组成员进行分段错误

  26. 26

    如何在不创建构造函数的情况下使用私有/受保护成员初始化POD结构?

  27. 27

    使用结构初始化哈希数组

  28. 28

    使用结构体初始化数组

  29. 29

    为什么灵活数组成员的静态初始化有效?

热门标签

归档