相关疑难解决方法(0)

确保模板参数是枚举类

有没有办法确保模板参数是枚举类型?

我知道type_traitsstd::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,不幸的是不能再高了(虽然我很想知道解决方案,即使它涉及更新的标准).

可能吗?

c++ template-meta-programming c++11

20
推荐指数
1
解决办法
1759
查看次数

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模板别名中的枚举类和枚举?

c++ templates variadic variadic-functions c++11

18
推荐指数
1
解决办法
2827
查看次数

如何实现is_enum_class类型特征?

当且仅当传入的类型T是类枚举时,如何实现其值成员为true的类型特征?虽然我知道这一点

+T{};
Run Code Online (Sandbox Code Playgroud)

如果T是一个枚举,它将起作用,如果它是一个枚举类,则会失败,到目前为止我找不到将它用于SFINAE的方法.

c++ metaprogramming sfinae type-traits

9
推荐指数
2
解决办法
1482
查看次数

是否可以确定枚举是否是强类型的?

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)

c++ enums type-traits c++11

8
推荐指数
1
解决办法
246
查看次数

如何检查类型是否是枚举类?

使用以下代码,我可以在编译时检查类型 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,但它看起来像一个技巧。有没有更好的办法?

c++ enums enum-class

5
推荐指数
0
解决办法
395
查看次数