c++ - 用于枚举的模板化 QDataStream 运算符<<

标签 c++ qt

根据本网站上的各种答案,我尝试定义自己的模板函数以将任何枚举值写入 QDataStream。

template <typename T, typename std::enable_if_t<std::is_enum<T>::value>>
QDataStream &operator<<(QDataStream& stream, T enumValue)
{
    stream << static_cast<std::underlying_type_t<T>>(enumValue);
    return stream;
}

enum class MyEnum_e : int16_t{};

QDataStream stream;
MyEnum_e value;
stream << value; // Doesn't work

但我无法让它发挥作用。编译失败并显示以下消息:

no match for 'operator<<' (operand types are 'QDataStream' and 'MyEnum_e') stream << value;

为每个单独的枚举定义函数,我按预期工作。我使用的 enable_if 错了吗?

最佳答案

您需要将 enable_if_t 作为模板参数的默认值。

template <typename T, typename U=std::enable_if_t<std::is_enum<T>::value>>
QDataStream &operator<<(QDataStream& stream, T enumValue)
{
    stream << static_cast<std::underlying_type_t<T>>(enumValue);
    return stream;
}

关于c++ - 用于枚举的模板化 QDataStream 运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42868924/

相关文章:

c++ - 我可以在 Visual C++ 2010 中导入 QT .pro 文件吗

c++ - QVector size() 返回大小为零

C++从void函数获取结果值

c# - hunspell 拼写检查

c++ - OMP中的减少和折叠条款有一些令人困惑的地方

c++ - 堆栈溢出,无法从 HTTP 服务器发送和接收数据

c++ - 专用模板的多重实例化

Qt:在 lamdas 中发出信号好还是不好的风格(并且会引起问题)

c++ - Qt 自动连接操作

c++ - 在发送之前访问 QNetworkRequest 数据