动态迭代静态信息
Dynamically iterate over static information
假设我有一些 class 专门用于每个枚举类型:
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;
}
我知道我可以在其他地方创建一个映射来解决这种映射(对于字符串,而不是类型...)
我没有权限使用 boost
在合适的 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;
}
);
但是要小心,因为它只有在所有枚举成员都是顺序的情况下才有效。
假设我有一些 class 专门用于每个枚举类型:
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;
}
我知道我可以在其他地方创建一个映射来解决这种映射(对于字符串,而不是类型...)
我没有权限使用 boost
在合适的 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;
}
);
但是要小心,因为它只有在所有枚举成员都是顺序的情况下才有效。