有没有办法确保模板参数是枚举类型?
我知道type_traits有std::is_enum,但我不希望它匹配常规枚举,只是enum_classes.
想要效果的示例:
enum class EnumClass {};
enum Enum {};
class Class {};
template <typename T>
void Example()
{
static_assert(/* T is EnumClass */, "`T` must be an enum class");
}
Example<EnumClass>(); // Ok
Example<Enum>(); // Error
Example<Class>(); // Error
Run Code Online (Sandbox Code Playgroud)
我使用的是C++ 11,不幸的是不能再高了(虽然我很想知道解决方案,即使它涉及更新的标准).
可能吗?
我正在编写一个类似于boost :: promote的促销模板别名,但是对于C++ 11.这样做的目的是在从varidic函数检索参数时避免警告.例如
template <typename T>
std::vector<T> MakeArgVectorV(int aArgCount, va_list aArgList)
{
std::vector<T> args;
while (aArgCount > 0)
{
args.push_back(static_cast<T>(va_arg(aArgList, Promote<T>)));
--aArgCount;
}
return args;
}
Run Code Online (Sandbox Code Playgroud)
Promote模板别名在可变参数的默认参数提升之后提升类型:1)小于int的整数被提升为int 2)float被提升为double
我的问题是可以提升标准C++枚举,但不提升C++ 11枚举类(编译器不会生成警告).我希望Promote使用常规枚举但忽略C++ 11枚举类.
如何区分我的Promote模板别名中的枚举类和枚举?
当且仅当传入的类型T是类枚举时,如何实现其值成员为true的类型特征?虽然我知道这一点
+T{};
Run Code Online (Sandbox Code Playgroud)
如果T是一个枚举,它将起作用,如果它是一个枚举类,则会失败,到目前为止我找不到将它用于SFINAE的方法.
C++ 11为我们如何处理枚举引入了两个不同的补充:一个使它们成为范围的选项,以及一个使它们键入的选项.所以现在我们有四种不同的枚举子类型:
enum Old {};
enum Typed : int8_t {};
enum class Scoped {};
enum class TypedScoped : int8_t {};
Run Code Online (Sandbox Code Playgroud)
这个问题询问如何确定枚举是否作用域.我想知道如何确定是否键入枚举.
附加信息
我使用Qt框架,它提供了QDataStream以便携式跨平台方式序列化/反序列化数据的类.显然,为了使结果数据流可移植,您必须以固定长度的形式存储所有整数.这也包括枚举.回到当天,我制作了几个辅助宏来定义枚举的序列化/反序列化,方法是将它们转换为具有固定(用户指定)长度的整数:
#define SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
QDataStream &operator<<(QDataStream &stream, _TYPE v);
#define SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE) \
QDataStream &operator>>(QDataStream &stream, _TYPE &v);
#define SC_DECLARE_DATASTREAM_OPERATORS(_TYPE) \
SC_DECLARE_DATASTREAM_WRITE_OPERATOR(_TYPE) \
SC_DECLARE_DATASTREAM_READ_OPERATOR(_TYPE)
#define SC_DEFINE_DATASTREAM_ENUM_WRITE_OPERATOR(_TYPE, _LEN) \
QDataStream &operator<<(QDataStream &stream, _TYPE v) \
{ \
qint ## _LEN t = v; \
static_assert(sizeof(t) >= sizeof(v), "Increase length"); \
stream << t; \
return …Run Code Online (Sandbox Code Playgroud) 使用以下代码,我可以在编译时检查类型 E 是否为枚举:
static_assert(true == std::is_enum<E>::value, "Must be an enum");
Run Code Online (Sandbox Code Playgroud)
我如何检查它是否是一个enum class?
在这里他们建议添加 check !std::is_convertible<T, int>::value,但它看起来像一个技巧。有没有更好的办法?