2016-02-15 7 views
12

クラスにメソッドoperator==があるかどうかを確認しようとしています。私はSFINAE hereで解決策を見つけました。それは私が作るクラスでうまくいきます。intに演算子がありますか?

それは次のようになります。私がしようとすると、

template <typename T> 
class comparable 
{ 
    typedef char one; 
    typedef long two; 

    template <typename C> static one test(typeof(&C::operator==)) ; 
    template <typename C> static two test(...); 


public: 
    enum { value = sizeof(test<T>(0)) == sizeof(char) }; 
}; 

しかし:

std::cout << comparable<int>::value << std::endl; 

私はそれがtrueを返すことを期待している間、それはfalseを返します。どうしてこれなの ?

+1

あなたが編集する前にそこに持っていた疑問(3つのドットが何を意味するか)については、見この質問:http://stackoverflow.com/questions/1657883/variable-number-of-arguments-in-c – Anedar

+1

'class C {...}; bool演算子==(const C&a、const C&b){...} '?あなたのコードでは、クラス内にオペレータがないので、演算子==はないと言います。 – immibis

答えて

19

intはクラスタイプではなく、operator==というメンバーはありません。これは&C::operator==で確認したものです。従って、この試験は"no"をもたらす。他の人が正しく指摘したように、あなたのテストは非会員のoperator==だけのクラスでは否定的です。

がどのように正しくoperator==が存在するかどうかを確認するためにここに頼まれました:式C==Cが有効であれば How to check whether operator== exists?

+3

Dupe実際に?? –

+1

@πάνταῥεῖなぜ彼のアプローチが失敗するのか、彼には言わないので、少なくとも私はそれをMjölnirしません。しかし、私は同意する、それは容易な80の担当者だった。 –

+1

私たちはオーディンの息子であり、私たちの力の責任ある利用者でなければなりません。よく達成され、+80のためのおめでとう(1つは私の側からだった)。 –

4

あなたのテストはテストしません。クラスCC::operator==があるかどうかをテストします。 はクラスではないので、クラスメンバはありません。

typeof(C()==C())

10

あなたの即時のアプローチには、少なくとも2つの基本的な理由で欠陥がある(または不完全である)。 クラスCoperator ==という名前メンバーを持っているかどうかを

まず

、あなたの方法を確認します。非クラス型は、メンバーがまったくないため、このテストに合格しません。 intは非クラス型です。

第2に、このアプローチ自体は、operator ==がスタンドアロン機能として実装されているクラスを検出しません。たとえば、あなたのテストでは、std::stringには==演算子がないと言われます。 std::stringにそのようなメンバーがないのは事実ですが、std::stringとスタンドアロンのoperator ==を使用して同等であるかどうかを比較できます。したがって、たとえintが何らかの形でクラスタイプであったとしても、それはメンバー関数としてoperator ==を実装することを意味するものではありません。

0

あなたがC++ 11を使用している場合は、実装が非常に簡単になりますどのdecltypeを使用することができます。

#include <iostream> 
#include <type_traits> 

using namespace std; 

template <class T, class Sfinae = void> 
class comparable { 
public: 
    static constexpr bool value = false; 
}; 

template <class T> 
class comparable <T, typename enable_if<is_same<decltype(declval<T>() == declval<T>()), bool>::value>::type> { 
public: 
    static constexpr bool value = true; 
}; 

class A { 
public: 
    bool operator==(const A &) { 
     return true; 
    } 
}; 

class B { 
}; 

int main() { 
    cout << comparable<int>::value << endl; // output: 1 
    cout << comparable<A>::value << endl; // output: 1 
    cout << comparable<B>::value << endl; // output: 0 
} 
関連する問題