2012-01-12 28 views
7

Tôi là lập trình Java nhiều hay ít, vì vậy đây có thể là một câu hỏi ngu ngốc, nhưng tôi không tìm được giải pháp đơn giản nào.C++ xác định xem lớp có thể so sánh được

Tôi có một lớp học như thế này trong C++:

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

Và tôi cần T có thể so sánh - phải có ít nhất == <> khai thác xác định. Có bất kỳ đơn giản cách nào để làm điều này hay không hoặc thực tiễn tốt nhất cho việc này là gì? Trong Java, nó sẽ giống như sau:

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

Cảm ơn sự giúp đỡ của bạn!

+1

'Node' không phải là một lớp học, đó là một lớp mẫu. – ildjarn

+2

Có thể liên quan: [Phát hiện nhà điều hành hỗ trợ với decltype/SFINAE] (http://stackoverflow.com/q/5839357/636019) – ildjarn

Trả lời

13

Mẫu C++ là duck-typed, do đó không cần giao diện hoặc hạn chế, trình biên dịch sẽ sử dụng toán tử so sánh nếu chúng tồn tại và tạo lỗi nếu không.

Xem thêm this more detailed answer.

3

Nếu lớp mẫu của bạn sử dụng toán tử bạn đã đề cập, trình biên dịch sẽ phát ra lỗi nếu đối số kiểu mẫu không hỗ trợ các toán tử đó.

-2

Bạn có thể sử dụng lệnh std :: less, std :: more and std :: equal_to. Bằng cách sử dụng các hàm đó trong mã của riêng bạn, bạn đảm bảo rằng kiểu T của bạn có các phương thức được triển khai (loại mở rộng so sánh). Nếu loại của bạn không có phương pháp như vậy, bạn sẽ nhận được một lỗi biên dịch.

Kiểm tra this reference để xem một ví dụ sử dụng

+0

gọi std :: ít không đảm bảo bất cứ điều gì mà chỉ cần gọi 'a

4

Nếu bạn muốn tránh các lỗi khó hiểu (như bạn thường nhận được khi thiếu tính so sánh xảy ra sâu trong cây template instantiation), chỉ sử dụng enable_if:

Cụ thể, hãy xem "Bật chuyên môn lớp mẫu" trong tài liệu về tăng :: enable_if.

Bạn thường sử dụng enable_if với type_traits: http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html

Quan tâm đặc biệt trong trường hợp của bạn có thể là những người sau đây:

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

Nhưng xem thêm has_greater, has_greater_equal, has_less , has_less_equal, v.v. // Tôi thực sự hơi ngạc nhiên khi không có is_equality_compar đơn giản thể loại-đặc điểm.

// EDIT: nó xuất hiện tôi đã tìm thấy nó, nó :: boost :: is_equality_comparable :: giá trị trong Khái niệm Thư viện đặc điểm: http://neoscientists.org/~tschwinger/boostdev/concept_traits/libs/concept_traits/doc/

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

Tuy nhiên, nó dường như bị bỏ rơi : https://svn.boost.org/trac/boost/wiki/LibrariesUnderConstruction#Boost.ConceptTraits

Một giải pháp khác là sử dụng các khái niệm Boost Kiểm tra Thư viện (BCCL), đặc biệt là áp dụng EqualityComparableConcept:

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

Tuy nhiên, một sự thay thế: 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

Tuy nhiên, một sự thay thế: http://code.google.com/p/origin/source/browse/trunk/core/tests/concepts/equality_comparable.cpp

+0

Cảm ơn tất cả các liên kết, tôi sẽ kiểm tra ... –

+0

Bạn cũng có thể xem xét các điều sau: 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

Các vấn đề liên quan