通用 int -> 可以使用模板进行枚举转换吗?
generic int -> enum conversion with templates possible?
我使用这样的函数将int
(从遗留 API)转换为enum
:
TestEnum to_test_enum(int value) {
TestEnum converted(static_cast<TestEnum>(value));
# pragma GCC diagnostic push
# pragma GCC diagnostic error "-Wswitch"
switch (converted) {
case TestEnum::A:
case TestEnum::B:
return converted;
}
# pragma GCC diagnostic pop
throw std::runtime_error("wrong value");
}
如果将无效值传递给to_enum
,to_test_enum
会抛出异常,否则返回相应的TestEnum
值。pragma
确保在缺少合法值的情况下,我会收到编译器错误。
像这样的行现在将转换一个整数并在运行时进行有效性检查:
enum class TestEnum {
A = 1,
B = 2,
};
auto v1 = to_test_enum(2);
auto v2 = to_test_enum(3); // will throw
问题:我想知道是否有可能使用某种模板魔术将其转换为函数模板:
template<class E>
E to_enum(int value) {
E converted(static_cast<E>(value));
switch (converted) {
EACH ELEMENT e IN E: case e: <--- here goes some unrolling magic
return converted;
}
throw std::runtime_error("wrong value");
}
然后,该函数将像这样使用:
auto v1 = to_enum<TestEnum>(2);
auto v2 = to_enum<TestEnum>(3); // will throw
我不确定我是否理解你想做什么。请参阅下面的一个想法。您必须定义自己的map_enum< your_enum >()
才能将整数映射到枚举。
#include <map>
#include <iostream>
template< typename E > const std::map< int, E >& map_enum()
{
return 0;
}
template < typename E > E to_enum( int ai )
{
auto m = map_enum< E >();
auto const i = m.find( ai );
return i == m.end() ? throw -1 : i->second;
}
// { old api
#define RED 0
#define GREEN 1
#define BLUE 2
int old_api_fun()
{
return 2;
}
// } old api
// { your code
enum color_e
{
red = RED,
green = GREEN,
blue = BLUE
};
template<> const std::map< int, color_e >& map_enum()
{
static std::map< int, color_e > m ={ { RED, red }, { GREEN, green }, { BLUE, blue } };
return m;
}
// } your code
int main()
{
try
{
auto r = to_enum< color_e >( old_api_fun() );
std::cout << "success";
}
catch ( int )
{
std::cout << "failed";
}
return 0;
}
相关文章:
- 错误:从"int"到枚举c++的转换无效
- 将作用域枚举转换为基础类型
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 用于 boost::p roperty_tree 的通用枚举转换器
- 在编译时将强类型枚举器转换为其基础类型?
- SWIG-将C++枚举转换为Python枚举
- 如何将C++代码中的枚举转换为 C
- 将枚举转换为_variant_t C++
- 将枚举转换为值的正确方法
- 通用 int -> 可以使用模板进行枚举转换吗?
- 在 C++ 中通过 int 将枚举转换为枚举
- 将枚举转换为字符串
- 超出范围的枚举转换能否生成基础类型之外的值
- 将已有的枚举转换为字符串
- 如何自动将强类型枚举转换为整型
- 如何将c++枚举转换为ctypes ?结构使用Python 2.7.2
- 将C++枚举转换为python int
- C++11 将枚举转换为整数
- 有没有一种简单的方法可以将C++枚举转换为字符串
- 应该如何将C位标志枚举转换为C++