2012-01-12 9 views
7

मैं जावा प्रोग्रामर कम या कम हूं, इसलिए यह एक बेवकूफ सवाल हो सकता है, लेकिन मुझे कोई आसान समाधान नहीं मिला।सी ++ निर्धारित करता है कि कक्षा तुलनीय है

मैं C++ इस तरह एक वर्ग है:

template<class T> class Node {...} 

और मैं टी की जरूरत है तुलनीय होने के लिए - कम से कम == <> ऑपरेटरों परिभाषित किया गया है करने के लिए। क्या ऐसा करने के लिए कोई सरल तरीका है - या इसके लिए सबसे अच्छा अभ्यास क्या है? जावा में, यह कुछ ऐसा होगा:

public class Node<T extends Comparable> { ... } 

आपकी मदद के लिए धन्यवाद!

+1

'Node' एक वर्ग नहीं है, यह एक वर्ग टेम्पलेट है। – ildjarn

+2

संभावित रूप से संबंधित: [decltype/SFINAE के साथ ऑपरेटर समर्थन का पता लगाएं] (http://stackoverflow.com/q/5839357/636019) – ildjarn

उत्तर

13

सी ++ टेम्पलेट duck-typed हैं, इसलिए कोई इंटरफ़ेस या बाधा आवश्यक नहीं है, तो कंपाइलर तुलना ऑपरेटर का उपयोग करेगा यदि वे मौजूद हैं, और यदि कोई त्रुटि उत्पन्न नहीं होती है।

this more detailed answer भी देखें।

3

यदि आपकी टेम्पलेट क्लास आपके द्वारा उल्लिखित ऑपरेटरों का उपयोग करती है, तो टेम्पलेट प्रकार तर्क ऐसे ऑपरेटरों का समर्थन नहीं करता है तो त्रुटियों को उत्सर्जित करेगा।

-2

आप std :: less, std :: big और std :: equal_to का उपयोग कर सकते हैं। अपने कार्यों में उन कार्यों का उपयोग करके आप सुनिश्चित करते हैं कि आपके प्रकार टी में उन विधियों को लागू किया गया है (प्रकार तुलनात्मक रूप से विस्तारित)। यदि आपके प्रकार में ऐसी कोई विधि नहीं है तो आपको संकलन त्रुटि मिल जाएगी।

आदेश में एक के उपयोग का उदाहरण

+0

कॉलिंग std :: कम कुछ भी सुनिश्चित नहीं करता है जो 'ए <बी' करता है। –

4

आप गुप्त त्रुटियों से बचने के (के रूप में आप अक्सर जब तुलनीयता की कमी टेम्पलेट इन्स्टेन्शियशन पेड़ में गहरा हुआ) चाहते हैं, बस enable_if का उपयोग देखने के लिए चेक this reference:

विशेष रूप से, boost :: enable_if के दस्तावेज़ों में "टेम्पलेट क्लास विशेषज्ञता सक्षम करना" पर एक नज़र डालें।

आप अक्सर type_traits साथ enable_if का उपयोग करें:

http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/boost_typetraits/reference:/has_equal_to.html

http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/boost_typetraits/reference/has_not_equal_to.html

लेकिन भी has_greater देखते हैं, has_greater_equal, has_less: http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html

अपने मामले निम्नलिखित लोगों में हो सकता है विशेष रुचि के

, has_less_equal, आदि // मैं वास्तव में कुछ हद तक हैरान हूं कि एक सीधा नहीं है is_equality_compar सक्षम प्रकार-विशेषता।

// संपादित करें: ऐसा लगता है कि मैं यह मिल गया है, यह :: बढ़ावा :: is_equality_comparable :: संकल्पना लक्षण लाइब्रेरी में मूल्य: http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/

http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/#StandardConceptTraits

हालांकि, यह छोड़ दिया जाना प्रतीत होता है :

01: https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.ConceptTraits

एक वैकल्पिक समाधान EqualityComparableConcept लागू करने, जांच की जा रही लाइब्रेरी (बीसीसीएल) बूस्ट संकल्पना उपयोग करने के लिए विशेष रूप से है

फिर भी एक और विकल्प: Boost.Generic - https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.Generic

Prensentation: http://github.com/boostcon/2011_presentations/raw/master/thu/Boost.Generic.pdf

फिर भी एक और विकल्प: http://code.google.com/p/origin/source/browse/trunk/core/tests/concepts/equality_comparable.cpp

+0

सभी लिंक के लिए धन्यवाद, मैं इसे जांचूंगा ... –

+0

आप निम्न को भी देख सकते हैं: http://comments.gmane.org/gmane.comp.lib.boost.devel/223294 http : //www.martinecker.com/wiki/index.php title = Detecting_the_Existence_of_Operators_at_Compile समय – Matt