- ベストアンサー
型宣言の場合分け
下記のようなプログラムを作成しようと色々試行錯誤しているのですが、うまくいきません。trueとfalseで場合分けして関数を2つ作れば目的は達成されるのですが、プログラムが冗長になってしまい釈然としないのです。以下、私が試してみた方法を載せておきます。 (試行1) sengen関数の頭で if (togle) float a; else double a; としてみる。 結果 >> if文内でしか宣言されず、以後の処理でundeclared (試行2) まず、ソースの頭で #define SENGEN float とし、 sengen関数の頭で SENGEN a; とする。 次に、関数2の実行直前に #define SENGEN double と定義を上書きすることで関数1ではfloat宣言を、関数2ではdouble宣言を狙う。 結果 >> ディレクティブはプログラムの一番初めに実行されるらしく、両方ともdouble宣言になってしまって撃沈 完全にお手上げです。解決法を思いつく方いらっしゃいましたら助けてください //目的とするプログラム void sengen(bool togle){ // togle==true ならば float a; // togle==false ならば double a; ...適宜処理 } int main(){ sengen(true); // 関数1 sengen(false); // 関数2 }
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
実行時に切り替えるのは無理ですが、コンパイル時であればBoost.MPLを使えば簡単にできます。 #include <boost/mpl/if.hpp> template <bool F> struct sengen { typedef typename boost::mpl::if_c<F, float, double>::type type; }; int main() { sengen<true> a; sengen<false> b; }
その他の回答 (6)
- ICE_FALCON
- ベストアンサー率56% (63/111)
#ifdef __DOUBLE__ typedef double HOGE_T; #else //__DOUBLE__ typedef float HOGE_T; #endif //__DOUBLE__ //---------------------------------------------------- HOGE_T a; コンパイルオプションで__DOUBLE__をdefineするかしないかで doubleとfloat切り替えられる。
お礼
ありがとうございました!
- asuncion
- ベストアンサー率33% (2127/6289)
>美しいプログラムを書きたい それよりも、まず「正しく動く」プログラムを書く方が先でありましょう。 見栄えを気にするのは後からでもできます。
お礼
ありがとうございました!
- php504
- ベストアンサー率42% (926/2160)
コンパイルの段階で変数の型は決まってないといけないので変数の型を実行時に変更するのは不可能でしょう。 float用とdouble用の2個の関数を作るしかないと思います
お礼
ありがとうございました!
- jmh
- ベストアンサー率23% (71/304)
> 同じ計算をfloatの場合とdoubleの場合両方で > 「同じ計算」なのに「同じ答え」にならないのはなぜですか?
お礼
ありがとうございました!
- notnot
- ベストアンサー率47% (4900/10358)
何かをしたくて、 // togle==true ならば float a; // togle==false ならば double a; ということを考えたんでしょうが、その一歩が間違ってます。 もう一歩下がって、そもそも何をしたかったのか、まで戻って、考え直した方が良いです。
お礼
ありがとうございました!
- asuncion
- ベストアンサー率33% (2127/6289)
変数aをfloat型またはdouble型に決められない理由は何ですか?
お礼
ありがとうございました!
補足
回答有難うございます。 平方根を伴った計算式において、float及びdoubleでの誤差の違いを評価したいのです。 そのためには、同じ計算をfloatの場合とdoubleの場合両方で行う必要があります。 実はコレ学校の宿題でして、折角の機会なので美しいプログラムを書きたいと思い、質問をした次第です。
お礼
なるほど。template関数ですね。 C++を勉強し直してやっと理解できましたw。 以下のプログラム template <typename T> void sengen(){ T a; cout << "変数aのバイト数 : " << sizeof(a) << endl; } int main(){ sengen<float> (); sengen<double> (); } でテストしたところ、実行結果は 変数aのバイト数 : 4 変数aのバイト数 : 8 となり、目的が達成されました。 このようなお粗末な質問に回答してくださったjactaさんを始め7名の方々、本当に有難うございました。 Boostライブラリは今の自分には難しいので、今後時間をかけて勉強させていただきます。