2016-09-30 7 views
4

私のenable_ifステートメントが非常に長くなっていたので、何とかtypedefを使いたいと思っていました。私は最良の方法が何であるかは分かりません。 構造体でstd :: is_sameを連結する方法

は、私はこれを試してみましたが、それは誤りがある

template<typename T> 
struct isValidImageFormat 
{ 
    typedef 
     typename std::is_same<T, float>::value || 
     typename std::is_same<T, unsigned char>::value 
     value; 
}; 

を動作しません:

期待修飾されていない-ID»||«トークン 型名のstd :: is_same ::値の前に||

質問:

  • 私のコードの何が問題になっているのですか?
  • 私の問題にはどのような良い解決策がありますか?
+2

'のstd :: is_same :: [値]は、ので、あなたの全体' typedef'タイプではないと 'typename'ビジネスがしても意味がありません:C++ 14ので、簡単に変数のテンプレートを使用することができますで始まる。 –

答えて

11

あなたはstd::disjunction(のために「や」哲学の空想の単語を)欲しい:

typedef std::disjunction< 
    std::is_same<T, float>, 
    std::is_same<T, unsigned char>> condition; 

次に、あなたが真または偽の値を取得するためにcondition::valueを使用することができます。あなたが唯一の値をしたい場合は、この方法を試してください。

constexpr bool condition = 
    std::is_same<T, float>::value || 
    std::is_same<T, unsigned char>::value; 
+1

'std :: disjunction'はC++の一部です17。それはOPのための実行可能な解決策ではないかもしれません。 – skypjack

5

typenameキーワードはあなたの例では、あなたがconstexpr bool値で仕事をしたい、あなたがタイプで仕事をしたいときに使用されます。この方法を使用

template<typename T> 
struct isValidImageFormat 
{ 
    constexpr static bool value = 
     std::is_same<T, float>::value || 
     std::is_same<T, unsigned char>::value; 
}; 
2

isValidImageFormat<T>の結果は、常にstd::true_typestd::false_typeのいずれかです:あなたは、実際に構造体を必要としない

1 
0 
2

#include <utility> 
#include <iostream> 

template<typename T> 
struct isValidImageFormatImpl 
{ 
    static constexpr bool match = std::is_same<T, float>::value 
    or std::is_same<T, unsigned char>::value; 

    using type = std::conditional_t<match, std::true_type, std::false_type>; 
}; 


template<typename T> 
using isValidImageFormat = typename isValidImageFormatImpl<T>::type; 

int main() 
{ 
    std::cout << isValidImageFormat<float>() << '\n'; 
    std::cout << isValidImageFormat<int>() << '\n'; 

    static_assert(std::is_same<isValidImageFormat<float>, std::true_type>(), ""); 
    static_assert(std::is_same<isValidImageFormat<int>, std::false_type>(), ""); 

} 

の予想される出力。

#include <type_traits> 

template<typename...> 
constexpr bool isValidImageFormatVar = false; 

template<typename T, typename U, typename... O> 
constexpr bool isValidImageFormatVar<T, U, O...> = std::is_same<T, U>::value || isValidImageFormatVar<T, O...>; 

template<typename T> 
constexpr bool isValidImageFormat = isValidImageFormatVar<T, float, unsigned char>; 

int main() { 
    static_assert(isValidImageFormat<float>, "!"); 
    static_assert(isValidImageFormat<unsigned char>, "!"); 
    static_assert(not isValidImageFormat<int>, "!"); 
} 
関連する問題