4

たとえば、のブール値を決定するために三項比較演算子をどのように実装しa < b < cますか?

4

2 に答える 2

7

解決策: 比較をコーディングするときは、戻り値の型をcomparison追加の比較を連鎖できるオブジェクトにする必要がありますが、暗黙的にbool. これは、手動でタイプにキャストするだけで、この意図でコーディングされていないタイプでも (一種の) 動作する可能性がありますcomparison

実装:

template<class T>
class comparison {
  const bool result;
  const T& last;
public:
  comparison(const T& l, bool r=true) :result(r), last(l) {}
  operator bool() const {return result;}
  comparison operator<(const T& rhs) const {return comparison(rhs, (result && last<rhs));}
  comparison operator<=(const T& rhs) const {return comparison(rhs, (result && last<=rhs));}
  comparison operator>(const T& rhs) const {return comparison(rhs, (result && last>rhs));}
  comparison operator>=(const T& rhs) const {return comparison(rhs, (result && last>=rhs));}
};

役に立つ例:

#include <iostream>
int main() {
  //testing of chained comparisons with int
  std::cout << (comparison<int>(0) < 1 < 2) << '\n';
  std::cout << (comparison<int>(0) < 1 > 2) << '\n';
  std::cout << (comparison<int>(0) > 1 < 2) << '\n';
  std::cout << (comparison<int>(0) > 1 > 2) << '\n';
}

出力:

1
0
0
0

注: これはMooing Duckによって作成されたもので、コンパイルされたより堅牢な例がhttp://ideone.com/awrmKにあります。

于 2012-06-13T22:52:34.437 に答える
4

なぜオペレーターが必要なのですか?

inline bool RangeCheck(int a, int b, int c)
{
  return a < b && b < c;
}

また:

#define RANGE_CHECK(a, b, c) (((a) < (b)) && ((b) < (c)))
于 2012-06-13T23:02:21.063 に答える