以前に 9000 回以上回答された可能性のある質問がありますが、それをどのように表現すればよいかわかりません。これを試してみます。
いくつかの C++ の書籍やチュートリアルで、反復可能な値 (インクリメント可能な) セマンティクスを持つ独自のクラスを定義するときに、そのクラスをオーバーロードできることを見てきましoperator++
た (ここで述べていることはすべて、同様に当てはまると思いますoperator--
)。これを行う標準的な方法は次のようです。
class MyClass {
public:
MyClass& operator++ () {
increment_somehow();
return *this;
}
....
};
まあincrement_somehow()
...どういうわけかオブジェクトの値を増やします。
operator++
次に、次のような方法での後置バージョンを定義できます。
MyClass operator++ (MyClass& it, int dummy) {
MyClass copy(it);
++it;
return copy;
}
それはすべてうまくいきます(私はそのイディオムを正しく理解したと思います)が、問題は、operator++
すばやく定義するクラスごとにすべてを行うのは面倒で冗長になることです。演算子をオーバーロードするときに最近学びました。つまり、昨日知った<utility>
ヘッダーと内部の機能を利用することです ( 4年間離れてから C++ に戻ってきたばかりです...):rel_ops
class MyClass {
public:
bool operator== (const MyClass& that) {
return compare_for_equality_somehow(that);
}
bool operator< (const MyClass& that) {
return compare_for_lessality_somehow(that);
}
....
using namespace std::rel_ops; // operators >, >=, <=, ! are "magically" defined!
};
(類推の目的で「劣性」という用語を発明したところですが、私の頭は何らかの理由で正しい数学用語を思いつくことを拒否しています...)
Utility ヘッダーにある名前空間<step_ops.hpp>
をいくらか模倣した内容の単純なヘッダーを作成しました。std::rel_ops
数回のコンパイル後に私が見ることができるものから、それはただ動作します(TM)。このトリックを使用できますか / 使用する必要がありますか? using namespace MyLibrary::increment_operators
クラスを作成して(たとえば)を使用する場合に遭遇する可能性のある落とし穴は何ですか?
そして、おそらくもっと重要なことは、車輪を再発明しただけなのか、それとも、そのような種類のプロジェクトに集約できる便利な小さなライブラリを作成しただけなのかということです。C++ を使って自分自身を最新の状態に戻し、共同作業を行うために試みたほとんどすべての実験は、すでにboost::do_something
施設の下でカバーされているようで、長い時間を費やしてしまったことを悲しく思います。