次に、データ型(加算、減算など)に対する通常の操作を行いたいと思います。無限に対するすべての操作は、自然な方法で定義されます。たとえば、無限大 + 任意の整数 = 無限大です。
もちろん、これを struct 構成で実行してから、すべての操作を定義することもできます。C ++でこれを行うためのきちんとした方法はありますか?
ありがとうございました
次に、データ型(加算、減算など)に対する通常の操作を行いたいと思います。無限に対するすべての操作は、自然な方法で定義されます。たとえば、無限大 + 任意の整数 = 無限大です。
もちろん、これを struct 構成で実行してから、すべての操作を定義することもできます。C ++でこれを行うためのきちんとした方法はありますか?
ありがとうございました
C ++でこれを行うためのきちんとした方法はありますか?
幸いなことに、その必要はありません。この問題は、 ですでに解決 (およびテスト) されていboost::date_time::int_adapter
ます。
なぜdate_time
.
#include <boost/date_time/int_adapter.hpp>
#include <iostream>
int main()
{
typedef boost::date_time::int_adapter<int> integer;
integer const i = integer::max();
std::cout << "i = " << i << '\n';
std::cout << "i + 1 = " << i + 1 << '\n';
std::cout << "Infinity looks like: " << integer::pos_infinity() << '\n';
// So for instance , infinity + any integer = infinity.
std::cout << "infinity + any integer = " << integer::neg_infinity() + 1 << '\n';
}
i = 2147483645
i + 1 = not-a-number
Infinity looks like: +infinity
infinity + any integer = -infinity
暗黙の変換演算子とコンストラクターを定義して、ラップされた型との間で変換する場合 (あなたの場合は を意味すると思いますint
)、ラップされた値に対してすべての算術演算が期待どおりに機能します。このようなもの:
class Infinity {}; // Empty helper class, see second constructor
class MaybeInfinity {
int value;
bool infinity;
public:
MaybeInfinity(int value = 0) : value(value), infinity(false) {}
MaybeInfinity(Infinity) : value(0), infinity(true) {}
bool isInfinity() const { return infinity; }
const int & operator() const { return value; }
int & operator() { return value; }
...
};
ただし、算術演算 (の一部) のカスタム動作を定義したいとします。次に、すべての算術演算子をオーバーロードするのが最善です。たとえば、追加は次のように記述できます。
class MaybeInfinity {
...
MaybeInfinity operator +(const MaybeInfinity & other) const {
if (infinity || other.infinity) {
return Infinity();
}
return value + other.value;
}
...
};
特定の算術演算子をオーバーロードしていないすべての演算子については、変換演算子のおかげで、クラスは通常の整数演算のように動作することに注意してください。また、次のように、クラスと整数値を使用して計算できます。
MaybeInfinity number = 3;
number += 2;
MaybeInfinity otherNumber = Infinity();
number += otherNumber;
// and so on
PS: このクラスはテンプレートにすることができます。で置き換え、定義の前に を追加int
し、.cpp ファイルで実装を分離しないようにしてから、そのような型を使用するか、他のラップされた型を使用します。T
template<typename T>
MaybeInfinity<int>