2012-01-12 15 views
7

Sono più o meno programmatore Java, quindi questa potrebbe essere una domanda stupida, ma non sono riuscito a trovare alcuna soluzione semplice.C++ determina se la classe è paragonabile

Ho una classe come questo in C++:

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

E ho bisogno T ad essere paragonabile - per avere almeno == <> Operatori di definito. C'è un modo semplice per farlo - o qual è la migliore pratica per questo? In Java, sarebbe qualcosa di simile:

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

Grazie per il vostro aiuto!

+1

'Node' non è una classe, si tratta di un modello di classe. – ildjarn

+2

Possibilmente correlato: [Rileva il supporto operatore con decltype/SFINAE] (http://stackoverflow.com/q/5839357/636019) – ildjarn

risposta

13

I modelli C++ sono duck-typed, quindi nessuna interfaccia o vincolo è necessario, il compilatore utilizzerà gli operatori di confronto se esistono e genererà un errore in caso contrario.

Vedere anche this more detailed answer.

3

Se la classe del modello utilizza gli operatori menzionati, il compilatore emetterà errori se l'argomento del tipo di modello non supporta tali operatori.

-2

È possibile utilizzare std :: less, std :: greater e std :: equal_to. Usando queste funzioni nel tuo codice, ti assicuri che il tuo tipo T abbia quei metodi implementati (tipo di extends Comparable). Se il tuo tipo non ha questi metodi, otterrai un errore di compilazione.

check this reference per vedere un esempio di utilizzo

+0

chiamando std :: less non garantisce tutto ciò che chiama semplicemente 'a

4

Se si vuole evitare errori criptici (come spesso si ottiene quando la mancanza di comparabilità si è verificato in profondità nella struttura di modello di istanza), basta usare enable_if:

In particolare, dare un'occhiata a "Abilitazione delle specializzazioni di classe template" nei documenti di boost :: enable_if.

Si utilizza spesso enable_if con type_traits: http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html

Di particolare interesse nel tuo caso potrebbe essere le seguenti:

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

Ma vedi anche has_greater, has_greater_equal, has_less , has_less_equal, ecc. // Sono in qualche modo sorpreso dal fatto che non ci sia un equivoco problema_equality_compar tipo-tratto capace.

// EDIT: sembra che ho trovato, è :: boost :: :: is_equality_comparable valore nel Tratti concetto di biblioteca: http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/

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

Tuttavia, sembra essere abbandonato : https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.ConceptTraits

Una soluzione alternativa è quella di utilizzare il concetto Boost Controllo Library (BCCL), in particolare applicando l'EqualityComparableConcept:

http://www.boost.org/doc/libs/release/libs/concept_check/using_concept_check.htm

Ancora un'altra alternativa: 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

Ancora un'altra alternativa: http://code.google.com/p/origin/source/browse/trunk/core/tests/concepts/equality_comparable.cpp

+0

Grazie per tutti i link, lo controllerò ... –

+0

Puoi anche dare un'occhiata al seguente: 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-time – Matt

Problemi correlati