C ++ определить, сопоставим ли класс - PullRequest
10 голосов
/ 12 января 2012

Я более или менее программист на Java, так что это может быть глупым вопросом, но мне не удалось найти простого решения.

У меня есть такой класс в C ++:

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

И мне нужно, чтобы T был сопоставим - чтобы были определены как минимум == <> операторы. Есть ли простой способ сделать это - или каков наилучший способ для этого? В Java это будет примерно так:

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

Спасибо за вашу помощь!

Ответы [ 4 ]

14 голосов
/ 12 января 2012

C ++ шаблоны с типом утки , поэтому интерфейс или ограничение не требуются, компилятор будет использовать операторы сравнения, если они существуют, и выдаст ошибку, если нет.

См. Также этот более подробный ответ .

5 голосов
/ 13 января 2012

Если вы хотите избежать загадочных ошибок (как это часто бывает, когда отсутствие сопоставимости происходило глубоко в дереве создания шаблона), просто используйте enable_if:

В частности, обратите внимание на «Включение специализаций классов шаблонов» в документах boost :: enable_if.

Вы часто используете enable_if с type_traits: http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html

Особый интерес в вашем случае могут представлять следующие:

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, has_less_equal и т. Д. // Я на самом деле несколько удивлен тем, что не существует простой черты is_equality_comparable.

// РЕДАКТИРОВАТЬ: кажется, я его нашел, это :: boost :: is_equality_comparable :: value в библиотеке черт концепта: http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/

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

Однако, похоже, он заброшен: https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.ConceptTraits

Альтернативным решением является использование библиотеки проверки концепций повышения (BCCL), в частности, применение EqualityComparableConcept:

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

Еще одна альтернатива: Boost.Generic - https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.Generic

Представление: 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

2 голосов
/ 12 января 2012

Если ваш класс шаблона использует упомянутые вами операторы, компилятор выдаст ошибки, если аргумент типа шаблона не поддерживает такие операторы.

0 голосов
/ 12 января 2012

Вы можете использовать std :: less, std :: more и std :: equal_to.Используя эти функции в своем собственном коде, вы гарантируете, что в вашем типе T реализованы эти методы (вид расширяет Comparable).Если ваш тип не имеет таких методов, вы получите ошибку компиляции.

Проверьте эту ссылку , чтобы увидеть пример использования

...