c++ - 是否可以允许将类强制转换为任意枚举?

标签 c++ class enums casting

背景:我们有一个具有专用整数类型的嵌入式处理器。我们在 C++ 中模拟了这些类型,以允许在 Visual Studio 或 gcc 下构建代码,并使计算产生与在嵌入式处理器上相同的值。

以下代码可以很好地编译为嵌入式处理器(其中 int_t 是我们自定义的整数类型):

enum foo { VAL_0, VAL_1, VAL_2 };
int_t my_val = VAL_1;
foo foo_val = (foo)val;

嵌入式处理器的编译器以与 int 相同的方式将 int_t 视为普通整数类型,因此将其转换为枚举与将 int 转换为枚举是合法的。

int_t 的 C++ 仿真是一个重载各种运算符以赋予它们与嵌入类型相同的行为的类。

我们希望允许此代码也可以在针对任意枚举的仿真下进行编译。显然,我们可以将强制转换运算符添加到类中的任何特定枚举,但我们提供了一个通用库,并且我们希望允许开发人员对他们可能开发或使用的任意枚举执行此操作。

有什么方法可以在 C++ 中实现此行为,以便在这种情况下它的行为完全等同于标准 int 类型?

最佳答案

使用 C++11 的 std::is_enum和一些 sfinae 来限制构造函数:

template<typename E> 
int_t::int_t(E e, typename std::enable_if<std::is_enum<E>::value>::type* = nullptr)

或者用 C++14 稍微简洁的形式:

template<typename E> 
int_t::int_t(E e, std::enable_if_t<std::is_enum<E>::value>* = nullptr)

在 C++17 中最整洁的是:

template<typename E> 
int_t::int_t(E e, std::enable_if_t<std::is_enum_v<E>>* = nullptr)

编辑:

我最初是在错误的方向上做的。要允许转换一个枚举,并且只允许转换到一个枚举,您需要以类似的方式编写一个转换运算符:

template<typename E, std::enable_if_t<std::is_enum<E>::value>* = nullptr>
operator E() { return E{val}; }

关于c++ - 是否可以允许将类强制转换为任意枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41873538/

相关文章:

c++ - 是否可以将虚函数和函数对象混合使用 std 算法?

C++ 跨边界使用 std::vector

python - 如何使用 swig 包装器调用 C++ 类指针上的方法?

python - 在我的类的实例上调用 iter() 不会创建其当前值的 'snapshot'?

c++ - 我是否正确地将枚举值与 C+ +'s "或“运算符”进行了比较?

c++ - 如何使用c++中的文件读写doc、pdf文件

c++ - 如何使用在函数中本地创建的对象而不将其复制到内存中?

java - 获取泛型类型或泛型实例的类

c++ - 在集合 C++ 中使用枚举时遇到问题

java - ClassNotFoundException Sandwich.Java...它在哪里?