derleyici burada sizin için bir şey kendisi yapmayacağım ama gelen uygun bir sınıfını miras yoluyla otomatik olarak üretmek için nispeten basit bir şey gibi:
template< typename DerivedType >
class ComparisonOperators
{
public:
friend bool operator!=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(lhs == rhs);
}
friend bool operator<=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(rhs < lhs);
}
friend bool operator>(
DerivedType const& lhs,
DerivedType const& rhs)
{
return rhs < lhs;
}
friend bool operator>=(
DerivedType const& lhs,
DerivedType const& rhs)
{
return !(lhs < rhs);
}
protected:
~ComparisonOperators() {}
} ;
Sınıfındaki <
ve ==
tanımlayın
class MyClass : public ComparisonOperators<MyClass>
{
// ...
public:
bool operator==(MyClass const& other) const;
bool operator<(MyClass const& other) const;
// ...
};
Sadece bir not: ve operatörlerin tüm alırsınız bu türer ve el ı Actu versiyonunu basitleştirdik diğerleri de ==
ve <
tanımlar , üye için fonksiyonları compare
ve isEqual
görünen ve hiçbir isEqual
olduğunda ==
ve !=
için compare
kullanır kullanımı. Sanırım herhangi bir hata yaptı, ama asla bilemezsiniz.
Eğer işleç <'ve işleç ==' tanımlanmış, sağlamak için ['std :: rel_ops'] (http://en.cppreference.com/w/cpp/utility/rel_ops/operator_cmp) ad alanında sürükleyebilirsiniz operatörlerin geri kalanı, ama bu gerçekten iyi bir çözüm değil (http://stackoverflow.com/questions/62 25375/idiomatic kullanım-içinde-stdrel-op). [Boost.Operators] (http://stackoverflow.com/a/14756785/241631) bunu yapmanın doğru yolu. – Praetorian
Sadece bir kaç operatör yazarak kaydetmek için miras kullanarak bir şey değil. Onları elle eklemek isterim. =) –
, işlevselliği sağlayan bir sınıftan türeterek, büyük bir dokümantasyon değerine de sahiptir. Kavramların ilkel bir şeklidir. – TemplateRex