2016-08-12 3 views
6

C++のstd :: enable_if制約は、私が<code>enum class</code>の基になる型を返すようにしたい機能を与えられただけで、短い質問を変異体および問題

template< 
    typename T, 
    typename std::enable_if_t< 
    std::is_enum<T>::value, 
    typename std::underlying_type_t<T> 
    > 
> 
constexpr inline 
typename std::underlying_type_t<T> 
enumValue(T p_rVal) noexcept 
{ 
    return static_cast<typename std::underlying_type_t<T>>(p_rVal); 
} 

感謝:1は "オーバーロードされた関数がを見つかりませマッチング"(2015 VS)エラーで失敗します助けをたくさん!

+0

@ダンなぜあなたは Torbjörnによって提案された編集を拒否しましたか?この投稿の書式設定を改善することは理にかなっています。 – Walter

+0

'std :: underlying_type_t 'の前に 'typename'は必要ありません。 – Oktalist

+0

はい、そうです、C++ 14の利点です。私はすでにbtwを削除しましたが、それでもヒントのためにありがとう! – gilgamash

答えて

2

最初の例では、templateパラメータTが1つしかありません。関数呼び出しでは、enumValue(myEnumClass)が引数から導かれます。これはstd::enable_if_t<>の正しい使用法です。

2番目の例では、2つのパラメータがあり、最初のパラメータは2番目のパラメータではありません。これは、std::enable_if_t<>を使用する不適切な/間違った方法です。

+0

AH!そうですね、2番目のバージョンのテンプレート>を試してみましたが、これはうまくいきます!答えてくれてありがとう! – gilgamash

+1

うん、デフォルトのテンプレート引数はここに行く方法です。関数のシグネチャが乱雑にならず、 'auto' return型の控除を使用することができます。 – Oktalist

関連する問題