これ何て呼びますか

下記のようなプログラムを作成しようと色々試行錯誤しているのですが、うまくいきません。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
}

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

なるほど。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ライブラリは今の自分には難しいので、今後時間をかけて勉強させていただきます。

お礼日時:2009/10/24 20:07

#ifdef __DOUBLE__


typedef double HOGE_T;
#else //__DOUBLE__
typedef float HOGE_T;
#endif //__DOUBLE__
//----------------------------------------------------
HOGE_T a;

コンパイルオプションで__DOUBLE__をdefineするかしないかで
doubleとfloat切り替えられる。
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:40

>美しいプログラムを書きたい



それよりも、まず「正しく動く」プログラムを書く方が先でありましょう。
見栄えを気にするのは後からでもできます。
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:40

コンパイルの段階で変数の型は決まってないといけないので変数の型を実行時に変更するのは不可能でしょう。


float用とdouble用の2個の関数を作るしかないと思います
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:40

> 同じ計算をfloatの場合とdoubleの場合両方で


>
「同じ計算」なのに「同じ答え」にならないのはなぜですか?
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:39

何かをしたくて、


 // togle==true ならば float a;
 // togle==false ならば double a;
ということを考えたんでしょうが、その一歩が間違ってます。

もう一歩下がって、そもそも何をしたかったのか、まで戻って、考え直した方が良いです。
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:39

変数aをfloat型またはdouble型に決められない理由は何ですか?

この回答への補足

回答有難うございます。
平方根を伴った計算式において、float及びdoubleでの誤差の違いを評価したいのです。
そのためには、同じ計算をfloatの場合とdoubleの場合両方で行う必要があります。
実はコレ学校の宿題でして、折角の機会なので美しいプログラムを書きたいと思い、質問をした次第です。

補足日時:2009/10/24 02:37
    • good
    • 0
この回答へのお礼

ありがとうございました!

お礼日時:2011/07/18 22:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報