2016-08-12 9 views
2

"type == type"をテストするクラスを作成しますが、typeに演算子がない場合は失敗します。コンパイル時にタイプに "bool operator ==(const type&、const type&)"というウェイテストがありますか?

template <typename _Type> 
double _test(...){ 
    return 0; 
} 

template <typename _Type> 
auto _test(_Type&& t)->decltype(t == t){ 
    return 0; 
} 

template <typename _Type> 
struct has_equal_to 
{ 
    static const bool value = sizeof(_test(std::declval<_Type>())) == sizeof(char); 
}; 

struct test{}; 

int main() 
{ 
    std::cout << has_equal_to<test>::value << std::endl; // compile failed ~~~~ 
    return 1; 
} 

誰でも手伝ってもらえますか? それとも、このようなクラスを記述することは不可能である.....

+1

私は信じられるかもしれません。 http://en.cppreference.com/w/cpp/language/sfinaeを参照してください。私はこれを解決する賢明な回答者をupvoteよ! – Bathsheba

+1

'sizeof(char)'は正しいですか? 'sizeof(ブール)'確かに? –

+0

私は同じ質問が既に存在すると思います。http://stackoverflow.com/questions/6534041/how-to-check-whether-operator-exists? – Shrikant

答えて

7

_Typeを推定することができず、とにかくそのコンテキストでは関係ありませんとあなたの最初のtestの過負荷は、テンプレートではありません。

double _test(...){ 
    return 0; 
} 

Live Demo


あなたは少し少ない定型を使用して同じことを達成することができますC++ 17の(あなたが簡単にC++ 11のために自分自身を実装することができます)std::void_t

template <typename T, typename = void> 
struct has_equal_to : std::false_type{}; 

template <typename T> 
struct has_equal_to<T, 
     std::void_t<decltype(std::declval<T>() == std::declval<T>())>> 
: std::true_type{}; 

Live Demo


それとも、さらに少ないためstd::experimental::is_detectedを使用することができます。無関係なノートで

template <typename T> 
using equal_to_t = decltype(std::declval<T>() == std::declval<T>()); 

template <typename T> 
using has_equal_to = std::experimental::is_detected<equal_to_t, T>; 

Live Demo


を、あなたは私たちいけませんアンダースコアで始まる名前。それらは実装に予約されています。

+0

ありがとうございました.... 本当に役に立ちました – NeoLiu