背景:我们有一个具有专用整数类型的嵌入式处理器。我们在 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/