gpt4 book ai didi

c++ - 枚举列表到 STL 容器

转载 作者:行者123 更新时间:2023-11-28 06:37:22 27 4
gpt4 key购买 nike

有人可以改进我的这个功能吗? enumToSTLContainer 用于返回其元素来自指定枚举列表的任何 STL 容器。

#include <iostream>
#include <vector>
#include <set>

enum MyEnum {A, B, C, D, E, FirstMyEnum = A, LastMyEnum = E};

template <typename CONTAINER>
CONTAINER enumToSTLContainer (typename CONTAINER::value_type first, typename CONTAINER::value_type last) {
CONTAINER v;
for (typename std::underlying_type<typename CONTAINER::value_type>::type N = first; N <= last; N++)
v.push_back(static_cast<typename CONTAINER::value_type>(N)); // But only works for STL containers with push_back defined.
return v;
}

int main() {
const std::vector<MyEnum> enumVector = enumToSTLContainer<std::vector<MyEnum>> (FirstMyEnum, LastMyEnum);
for (MyEnum x : enumVector)
std::cout << x << ' '; // 0 1 2 3 4
// const std::set<MyEnum> enumSet = enumToSTLContainer<std::set<MyEnum>> (FirstMyEnum, LastMyEnum); // won't compile
}

上面的问题。仅适用于定义了 push_back 的 STL 容器,需要指定枚举列表的第一个和最后一个元素,如果枚举值不连续则不起作用,...

也许使用可变参数模板获得一个 initializer_list,然后它可以返回所需的 STL 容器?使用 std::integer_sequence 从枚举中创建一个元组,或者创建您自己的与枚举元素相对应的 integer_sequence,以防它们不连续?

最佳答案

好的,我通过以下得到了所需的属性,但它使用的假设是枚举基础值从零开始并且是连续的。解决方案是在 C++11 而不是 C++14 中,因此这里的每个人都应该能够编译它。

#include <iostream>
#include <vector>
#include <set>

enum MyEnum {A, B, C, D, E, NumElements};

template <std::size_t...> struct index_sequence {};

template <std::size_t N, std::size_t... Is>
struct make_index_sequence_helper : make_index_sequence_helper<N-1, N-1, Is...> {};

template <std::size_t... Is>
struct make_index_sequence_helper<0, Is...> {
using type = index_sequence<Is...>;
};

template <std::size_t N>
using make_index_sequence = typename make_index_sequence_helper<N>::type;

template <typename RETURN_TYPE, std::size_t... TYPES>
inline RETURN_TYPE helper (index_sequence<TYPES...>) {
return {static_cast<typename RETURN_TYPE::value_type>(TYPES)...};
}

template <typename CONTAINER, std::size_t N>
CONTAINER enumToSTLContainer() {
return helper<CONTAINER> (make_index_sequence<N>());
}

int main() {
const std::vector<MyEnum> enumVector = enumToSTLContainer<std::vector<MyEnum>, NumElements>();
for (MyEnum x : enumVector)
std::cout << x << ' '; // 0 1 2 3 4
const std::set<MyEnum> enumSet = enumToSTLContainer<std::set<MyEnum>, NumElements>();
std::cout << "\n\n";
for (MyEnum x : enumSet)
std::cout << x << ' '; // 0 1 2 3 4
}

因此,对于第二种解决方案,我们不再局限于具有 push_back 的 STL 容器。如果有人能告诉我如何改进枚举基础值不连续的解决方案,我将不胜感激。理想情况下,也不需要 NumElements。我认为只有 make_index_sequence_helper 需要根据 MyEnum 基础值进行修改?

我唯一能想到的概括是糟糕的:

template <typename CONTAINER, std::size_t... Is>
CONTAINER enumNonContiguousToSTLContainer() {
return helper<CONTAINER> (index_sequence<Is...>());
}

关于c++ - 枚举列表到 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574813/

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