动态迭代静态信息

动态迭代静态信息

假设我有一些专门针对每种枚举类型的类:

enum MyEnum {
  EnumA = 0, EnumB, EnumSize
};

template <enum MyEnum>
class StaticEnumInfo {

};

template <>
class StaticEnumInfo<EnumA>{
  typedef bool type;
  const std::string name = "EnumA";
};

template <>
class StaticEnumInfo<EnumB>{
  typedef int type;
  const std::string name = "EnumB";
};

是否可以遍历所有名称并打印出来?
我想写一些类似的东西:
for(MyEnum i = EnumA; i < EnumSize; ++i){
    // Doesn't make sense, I know.
    std::cout << StaticEnumInfo<i>::name << std::endl;
}

我知道我可以在其他地方创建一个 map 来解决这种映射(对于字符串,而不是类型...)

我无权提升

最佳答案

在可以使用适当的expansion statements之前,您可以始终执行以下操作:

template <typename T, T... S, typename F>
constexpr void for_sequence(std::integer_sequence<T, S...>, F&& f) {
    (static_cast<void>(f(std::integral_constant<T, S>{})), ...);
}

并像这样使用它:
for_sequence(
    std::make_integer_sequence<int, EnumSize>{},
    [&](auto i) {
        constexpr auto index = static_cast<MyEnum>(int{i});
        std::cout << StaticEnumInfo<index>::name << std::endl;
    }
);

但是要小心,因为只有所有枚举成员都是顺序的,它才起作用。

Live example

关于c++ - 动态迭代静态信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57775192/

10-13 03:00