2017-03-18 15 views
2

このサイトでさまざまな答えを得て、列挙値をQDataStreamに書き込むための独自のテンプレート関数を定義しようとしました。列挙型のテンプレート付き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 

しかし、私はそれを機能させることができません。コンパイルは次のメッセージで失敗:

ストリーム< <値(オペランドタイプが「QDataStream」と 「MyEnum_e」は「)演算子< <」の不一致。

個々の列挙に対して関数を定義すると、期待通りに機能します。私はenable_ifを使っていますか?

答えて

2

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; 
} 
関連する問題