<
연산자를 정의한 후에는 나머지 관계 연산자의 동작을 추정 할 수 있습니다. 내 수업을 위해 그렇게 할 수있는 방법을 구현하려고합니다.C++ 관계 연산자 생성자
내가 원하는 것은 <
과 나머지 연산자를 암시 적으로 기본값으로 정의하는 것입니다. 내가 지금까지있어하는 I가 정교 것이 디자인이며, 더 아래 : 연산자의 나머지를 가지고 그냥 relational
에서 상속 걸릴 것 <
연산자를 구현하는 클래스에 대한 그래서
template<typename T>
struct relational
{
friend bool operator> (T const &lhs, T const &rhs) { return rhs < lhs; }
friend bool operator==(T const &lhs, T const &rhs) { return !(lhs < rhs || lhs > rhs); }
friend bool operator!=(T const &lhs, T const &rhs) { return !(rhs == lhs); }
friend bool operator<=(T const &lhs, T const &rhs) { return !(rhs < lhs); }
friend bool operator>=(T const &lhs, T const &rhs) { return !(lhs < rhs); }
};
기본값.
struct foo : relational<foo>
{
// implement < operator here
};
- 어떤 대안, 더 나은 디자인이 있습니까?
이 코드에는 시한 폭탄이 있습니까? 사용자가 연산자 중 하나에 대한 사용자 정의 구현을 정의하려는 경우 과부하 해결은 템플릿이 아닌 (사용자 정의) 구현을 선택하고 선택하는 것으로 가정합니다. 그 경우가 아니면 (또는 내가
relational
에서 상속하는 클래스 템플릿에 문제가있을 것입니다)relational
같은 연산자를 구현해야합니까? 귀하의 조언에 대한// inside the relational struct friend bool operator>(relational const &lhs, relational const &rhs) { // functions that involve implicit conversion are less favourable in overload resolution return (T const&)rhs < (T const&)lhs; }
감사합니다, 여기에 demo of the code working
. 이것이 어떤 점에서 당신을 때릴 지 모르겠습니다. –
사이드 노트 : rhs는 "오른쪽"을 의미하고 lhs는 "왼손 쪽"을 의미합니다. 함수 매개 변수의 이름이 반대로 표시됩니다. 또한'operator =='를'operator = '로 정의하는 것은 수학적으로 흥미로울 수 있지만 실제 operator가'operator <'를 두 번 호출하기 때문에 퍼포먼스 친화적이지는 않을 것입니다. =='. – Shahbaz
1. [Boost.Operators] (http://www.boost.org/doc/libs/1_55_0/libs/utility/operators.htm)와 ['std :: rel_ops'] (http : //en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp). 2. 2 개의 기본 연산을 허용하면 더 많은 클라이언트를 찾을 수 있습니다 :'<'와'=='. '<'순서가 합계가 아닌 '! (a b) && a! = b' 인 경우가 있습니다. – Angew