STL容器的枚举列表
Enum list to STL container
有人能改进我的这个功能吗?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_sequet与它们相对应?
好的,我用以下内容得到了所需的属性,但它使用了枚举基础值从零开始并且是连续的假设。解决方案是用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 << "nn";
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++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- C++关于ENUM的问题。我得到的响应比枚举列表大
- std::初始值设定项列表来自现有的 std::array,而不枚举每个元素
- 枚举值的编译时列表
- 当枚举器列表项的标识符已是结构的成员时,如何使用枚举器列表项
- 枚举可以在成员初始化列表中初始化吗?
- STL容器的枚举列表
- 如何使用包含不同typedef枚举的派生类模板设置构造函数初始化列表
- 使用方向枚举列表时反转方向(从左到右或从上到下)
- C++11 初始值设定项列表、数组和枚举的乐趣
- 枚举类的vector的初始化列表存在问题
- 与枚举器列表成员相关联的整数值是多少?