2012-01-12 26 views
7

Soy más o menos programador de Java, por lo que esta podría ser una pregunta estúpida, pero no logré encontrar ninguna solución simple.C++ determine si la clase es comparable

que tienen una clase como esta en C++:

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

y necesito T para ser comparable - tener al menos ==> < operadores definido. ¿Hay alguna forma de hacer esto para simple, o cuál es la mejor práctica para esto? En Java, sería algo como esto:

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

¡Gracias por su ayuda!

+1

'Node' no es una clase, es una plantilla de clase. – ildjarn

+2

Posiblemente relacionado: [Detectar la compatibilidad del operador con decltype/SFINAE] (http://stackoverflow.com/q/5839357/636019) – ildjarn

Respuesta

13

Las plantillas de C++ son duck-typed, por lo que no es necesaria ninguna interfaz o restricción, el compilador utilizará los operadores de comparación si existen, y generará un error si no es así.

Véase también this more detailed answer.

3

Si su clase de plantilla hace uso de los operadores que ha mencionado, el compilador emitirá errores si el argumento del tipo de plantilla no admite dichos operadores.

-2

Puede usar std :: less, std :: greater y std :: equal_to. Al usar esas funciones en su propio código, se asegura de que su tipo T tenga esos métodos implementados (tipo de extensión Comparable). Si su tipo no tiene tales métodos, obtendrá un error de compilación.

Comprobar this reference con el fin de ver un ejemplo de uso

+0

al llamar a std :: less no se garantiza nada que solo llame a 'a

4

Si se quiere evitar errores crípticos (como a menudo se tiene cuando la falta de comparabilidad se produjo profundamente en el árbol de instancias de plantilla), sólo tiene que utilizar enable_if:

En particular, consulte "Habilitar las especializaciones de clase de plantilla" en los documentos de boost :: enable_if.

Se utiliza a menudo enable_if con type_traits: http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html

De particular interés en su caso, podrían ser las siguientes:

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

Pero véase también has_greater, has_greater_equal, has_less , has_less_equal, etc. // De hecho, estoy sorprendido de que no haya una relación directa is_equality_compar tipo-rasgo capaz

// EDIT: parece que lo he encontrado, es :: impulso :: :: is_equality_comparable valor en la Biblioteca Rasgos Concepto: http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/

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

Sin embargo, parece que ser abandonado : https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.ConceptTraits

Una solución alternativa es utilizar el concepto de Boost Comprobación Biblioteca (BCCL), en particular la aplicación de la EqualityComparableConcept:

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

Otra 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

Otra alternativa: http://code.google.com/p/origin/source/browse/trunk/core/tests/concepts/equality_comparable.cpp

+0

Gracias por todos los enlaces, lo comprobaré ... –

+0

También puede consultar lo siguiente: 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

Cuestiones relacionadas