C ++确定类是否具有可比性

时间:2012-01-12 16:45:26

标签: c++ templates generics comparable

我或多或少是Java程序员,所以这可能是一个愚蠢的问题,但我找不到任何简单的解决方案。

我在C ++中有这样的类:

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

我需要T才能具有可比性 - 至少要有==&lt; &GT;运营商定义。有没有简单方式来做到这一点 - 或者最佳做法是什么?在Java中,它将是这样的:

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

感谢您的帮助!

5 个答案:

答案 0 :(得分:14)

C ++模板是duck-typed,因此不需要任何接口或约束,编译器将使用比较运算符(如果存在),如果不存在则生成错误。

另见this more detailed answer

答案 1 :(得分:5)

如果你想避免神秘错误(正如你经常在模板实例化树中缺乏可比性时那样),只需使用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

另一种解决方案是使用Boost概念检查库(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

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

答案 2 :(得分:2)

如果你的模板类使用你提到的运算符,如果模板类型参数不支持这样的运算符,编译器将发出错误。

答案 3 :(得分:1)

现在可以在C ++ 20 Concepts库中实现。

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "eject": "expo eject"
  },
   "dependencies": {
    "@react-native-community/masked-view": "^0.1.8",
    "@react-navigation/native": "^5.1.5",
    "expo": "^35.0.0",
    "react": "16.8.3",
    "react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz",
    "react-native-gesture-handler": "~1.3.0",
    "react-native-keyboard-aware-scroll-view": "^0.8.0",
    "react-native-reanimated": "~1.2.0",
    "react-native-responsive-screen": "^1.4.1",
    "react-native-safe-area-context": "^0.3.6",
    "react-native-screens": "^1.0.0-alpha.23",
    "react-native-star-rating": "^1.1.0",
    "react-navigation": "^3.13.0"
  },
  "devDependencies": {
    "babel-preset-expo": "^7.0.0"
  },
  "private": true
}

尽管如果不满意该概念,这仍然会引发错误,但是它使您更容易理解导致错误的原因。您可以在其周围编写包装器以防止错误。

答案 4 :(得分:-4)

您可以使用std :: less,std :: greater和std :: equal_to。通过在您自己的代码中使用这些函数,您可以确保类型T已实现这些方法(类似于扩展Comparable)。如果您的类型没有这样的方法,您将收到编译错误。

检查this reference以查看使用示例