2016-02-15 5 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; 

तो यह झूठी देता है, जबकि मैं यह उम्मीद कर रहा था सच लौटने के लिए। ऐसा क्यों है ?

+1

सवाल आप अपने संपादन (तीन बिंदु क्या मतलब है) से पहले में था के बारे में, देखो यह प्रश्न: http://stackoverflow.com/questions/1657883/variable-number-of-arguments-in-c – Anedar

+1

क्या होगा यदि 'कक्षा सी {...}; बूल ऑपरेटर == (कॉन्स सी एंड ए, कॉन्स सी और बी) {...} '? आपका कोड कहता है कि कोई ऑपरेटर == नहीं है, क्योंकि कक्षा में कोई भी नहीं है। – immibis

उत्तर

19

int कक्षा-प्रकार नहीं है और उसके पास operator== कोई सदस्य नहीं है, जो आप अपने &C::operator== के साथ जांचते हैं। इस प्रकार, परीक्षण "नहीं" उत्पन्न करता है। जैसे-जैसे दूसरों ने सही ढंग से बताया, आपका परीक्षण केवल गैर-सदस्य operator== वाले वर्गों के लिए नकारात्मक होगा।

सही ढंग से कैसे की जाँच करने के लिए एक operator== मौजूद है यहाँ कहा गया है कि क्या: अगर अभिव्यक्ति C==C मान्य है How to check whether operator== exists?

+3

वास्तव में डुपे ?? –

+1

@ πάνταῥεῖ यह उसे नहीं बताता कि उसका दृष्टिकोण क्यों विफल रहता है, इसलिए कम से कम मैं इसे Mjölnir नहीं करूँगा। लेकिन मैं सहमत हूं, यह एक आसान 80 प्रतिनिधि था। –

+1

हम ओडिन के बेटे हैं और हमें जिम्मेदार रूप से हमारी शक्तियों के उपयोगकर्ता होना चाहिए। अच्छी तरह से हासिल किया, और +80 के लिए बधाई (एक 10 मेरी तरफ से था)। –

4

आपका परीक्षण परीक्षण नहीं होता है। यह परीक्षण करता है कि आपकी कक्षा C में C::operator== है। चूंकि int कोई कक्षा नहीं है, इसमें कोई कक्षा-सदस्य नहीं हैं।

परीक्षण का प्रयास करें उदा। typeof(C()==C())

10

आपका तत्काल दृष्टिकोण कम से कम दो मौलिक कारणों से त्रुटिपूर्ण (या अपूर्ण) है। C एक सदस्य है

सबसे पहले, अपने विधि चेकों कि क्या वर्गoperator == नाम दिया है। गैर-वर्ग के प्रकार इस परीक्षा को पास नहीं करेंगे, क्योंकि उनके पास कोई भी सदस्य नहीं है। और int एक गैर-वर्ग प्रकार है।

दूसरा, यह दृष्टिकोण स्वयं कक्षाओं का पता नहीं लगाता है जिसके लिए operator == एक स्टैंडअलोन फ़ंक्शन के रूप में लागू किया गया है। उदाहरण के लिए, आपका परीक्षण कहता है कि std::string में == ऑपरेटर नहीं है। यह सच है कि std::string में ऐसा कोई सदस्य नहीं है, फिर भी आप स्टैंडअलोन operator == का उपयोग करके समानता के लिए std::string की तुलना कर सकते हैं। तो, भले ही 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 
} 
संबंधित मुद्दे