template <typename LEFT>
class ___Comp
{
private:
const LEFT& left;
bool res;
public:
explicit ___Comp(const LEFT& left) :
left(left), res(static_cast<bool>(left)) { }
___Comp(const LEFT& left, bool res) :
left(left), res(res) { }
operator bool() {
return res;
}
template <typename RIGHT>
___Comp<RIGHT> operator==(const RIGHT& right) {
return ___Comp<RIGHT>(right, left == right);
}
template <typename RIGHT>
___Comp<RIGHT> operator!=(const RIGHT& right) {
return ___Comp<RIGHT>(right, left != right);
}
template <typename RIGHT>
___Comp<RIGHT> operator<=(const RIGHT& right) {
return ___Comp<RIGHT>(right, left <= right);
}
template <typename RIGHT>
___Comp<RIGHT> operator>=(const RIGHT& right) {
return ___Comp<RIGHT>(right, left >= right);
}
template <typename RIGHT>
___Comp<RIGHT> operator<(const RIGHT& right) {
return ___Comp<RIGHT>(right, left < right);
}
template <typename RIGHT>
___Comp<RIGHT> operator>(const RIGHT& right) {
return ___Comp<RIGHT>(right, left > right);
}
};
template <typename TYPE>
___Comp<TYPE> Comp(const TYPE& value) {
return ___Comp<TYPE>(value);
}
#include <iostream>
#include "bool.h"
using namespace std;
int main()
{
if(Comp(1) < 3 < 3) {
cout << "1 < 3 < 3" << endl;
}
if(Comp(1) < 3 <= 3) {
cout << "1 < 3 <= 3" << endl;
}
}
まだショートサーキットを組み込んでないけど、とりあえず。
あ、間違えてた。res の結果を継承しないといけない。
そして、それでショートサーキットも解決、と。
true の時だけ比較すればいい。
>>803 python にはあったんだ…知らなかった。
>>810 あ、それいい…
中置記法そのまま持ってきちゃえばよかったんだね。
>>814-817 結構いい線いけますね、それでも最初の型変換と計算中だけ型違いというのはなんとも気持ちが悪い、
テンプレートだけだとこの辺が限界かとは思うけど、新規の文法導入でもうちょっとなんとかならないかな。
>>820 あっ、私は807=919です。
C の演算子ベースで矛盾や混乱の起こりにくい記述を追及したいです。
型での記述だと、今何型になっているのかを常に意識する必要があって結構混乱の元になる。
新規文法にしても単純に < == > 等ではさむと優先順位が変になったり、
そこだけが極端に風変わりな文法になるのを防いだ書き方を追求したいです。
場当たり的な印象はするけれどもシンプルに
==. !=. <. >. <=. >=.
といった演算子を低めの優先順位で新規に設けるとか・・・
>>822 演算子の打ち間違いの問題が発生しそうなヨカン。
>>810 これ、マクロにする必要はないんでない?
=、 <、 <=、 >= も関数だし
(<, <=), (>, >=), (==, !=) でそれぞれ別のクラスにすれば綺麗になるね。
いろいろ改造したけど、ここに載せるには長いし、
実のところスレ違いなので載せるのはやめとくけど。