2017-03-06 15 views
5

私は、次のコードを持っている:C++は変数の型をコンテキストに依存しますか?

// Case #1 
float f = 1.0f; 
float f2 = sqrt(f * pi); 

// Case #2 
double d = 1.0; 
double d2 = sqrt(d * pi); 

operator*sqrtは、ケース#1にfloatの上で動作しますが、ケース#2にdoubleの上で動作するように変数piを定義する方法はありますか?

おそらく、C++ 14の変数テンプレートでは可能でしょうか?

答えて

11

並べ替え

template <class T> constexpr double pi = 3.14159...; 
template <> constexpr long double pi<long double> = 3.14159...L; 
template <> constexpr float pi<float> = 3.14159...F; 

しかし、あなたはあなたが望むどのpi指定する必要があります:あなたは確かに、このようなpiを定義することができます

float f2 = sqrt(f * pi<float>); 
double d2 = sqrt(d * pi<double>); 

をより直接的に、あなただけの依存operator*をオーバーロードしたいくつかのpiオブジェクトを定義することができますタイプ:

struct Pi { 
    template <class T> 
    decltype(pi<T>) operator*(T val) { return val * pi<T>; } 

    template <class T> 
    friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; } 
}; 

それはあなたが望む構文を得ることができますが、それは変です。しないでください。

+0

@LWimseyはい、オタク、ありがとう。 – Barry

+0

@ T.C。そんな感じ? – Barry

+0

あなたはそれをよりシンプルにすることができます - デフォルトの実装では、 'int'ではなく' double'値を定義する必要があります。 'テンプレート constexpr double pi = 3.0;' – Orient

関連する問題