• ベストアンサー

パーザ 複数の型の四則演算

http://www.kmonos.net/alang/boost/classes/spirit.html 上記のサイトを参考に、実数(float)も使えるように拡張しようと思いました。 union type{ int i; float f; }; stack<type> stk; これで、値をスタックに積む場合は問題なく実装できました。 しかし、これを取り出す時の処理がどうしても分かりません。 これを解決する方法・参考書籍・サイトをご存じの方、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

それこそまさに > struct ではなく class にして型情報を隠蔽し、setter/getter で型情報を適切に扱うようにした方が便利でしょうね。 ということで。 以下のコードを参考にどうぞ。 #include <stdio.h> class data { enum { type_int, type_float } type; union { int i; float f; } value; public: data() { type = type_int; value.i = 0;} data(int v) { type = type_int; value.i = v;} data(float v) { type = type_float; value.f = v;} operator int() const { return type == type_int ? value.i : (int)value.f; } operator float() const { return type == type_int ? (float)value.i : value.f; } }; int main(int argc, char *argv[]) { data v; int i; float f; v = data(3); i = v; f = v; printf("(int)v = %d, (float)v = %f\n", i, f); v = data(3.5f); i = v; f = v; printf("(int)v = %d, (float)v = %f\n", i, f); } 以上は、質問の int と float を使い分けるための記述ですが、 根本的な問題として、そもそも使い分ける必要があるのでしょうか float と int だと、float の有効数字は24bitで、 intが32bitの環境なら「intで表現できるがfloatで表現できない数」というのがありえますが、 double を使えば、精度は有効数字53bitなので、32bit int で表現できる数はそのまま double でも誤差なく表現できます。 ですから、電卓を実数対応するなら、そもそも全ての「数値」をintでなくdoubleで扱うようにするだけでOKです。unionの出番はありません。

sankaku197
質問者

お礼

うわ凄い、こんな書き方が出来るとは知りませんでした。 いやもう本当勉強になりました、ありがとうございます。 とりあえずはunionを使わずにdoubleでいいかなと思いました。 unionが必要になるとしたらlongとか文字列も扱う時くらいですよね。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

union だけでは「どの型でデータを入れているのか」という情報がありませんから、別途その情報も入れる必要があります。 struct data { enum { type_int, type_float } type; union { int i; float f; } value; }; とでもして、スタックに積むときに data v; v.type = data::type_int; v.value.i = ○○; とか v.type = data::type_float; v.value.f = ○○; といった使い方をしてください。 オブジェクト指向をもうちょっと進めるなら、 struct ではなく class にして型情報を隠蔽し、setter/getter で型情報を適切に扱うようにした方が便利でしょうね。

sankaku197
質問者

お礼

回答ありがとうございます。 なるほど、unionを使ったら構造体(クラス)もセットで必要になるわけですね。 おかげ様で、型の判別は出来たのですけどまた詰まってしまいました。 これ取り出そうと思ったんですけど結局どうやったら代入出来るのでしょう? int b = toppop(), a = toppop(); //↑スタックの中身はfloatかもしれない stk.push(a+b); 質問の参考リンクではintの決め打ちで済んでいますけど、今回の場合はintかfloatの宣言が欲しいです。 まさか実行時に型宣言を変更できるとも思えませんし、かといってunionで宣言したらクラスで組んだ意味がなくなりますし……うーん。 if文で地道に場合分けをするしかないのでしょうか?

関連するQ&A