我或多或少是Java程序员,所以这可能是一个愚蠢的问题,但我找不到任何简单的解决方案。
我在C ++中有这样的类:
template<class T> class Node {...}
我需要T才能具有可比性 - 至少要有==&lt; &GT;运营商定义。有没有简单方式来做到这一点 - 或者最佳做法是什么?在Java中,它将是这样的:
public class Node<T extends Comparable> { ... }
感谢您的帮助!
答案 0 :(得分:14)
C ++模板是duck-typed,因此不需要任何接口或约束,编译器将使用比较运算符(如果存在),如果不存在则生成错误。
答案 1 :(得分:5)
如果你想避免神秘错误(正如你经常在模板实例化树中缺乏可比性时那样),只需使用enable_if:
如果你有C ++ 98或C ++ 03编译器,那么boost :: enable_if:http://www.boost.org/doc/libs/release/libs/utility/enable_if.html
如果你有C ++ 11编译器,std :: enable_if:http://en.cppreference.com/w/cpp/types/enable_if
特别是,请看一下boost :: enable_if的文档中的“启用模板类特化”。
您经常将enable_if与type_traits一起使用:http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.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/
但是,它似乎被放弃了: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以查看使用示例