2011-07-21 18 views
2

私は、範囲パラメータを持つテンプレート統計クラスを持っています。numeric_limitsを使用してパラメータ値をデフォルト値に設定する

template <typename T> 
class limitStats 
{ 
public: 
    limitStats(T mx, T min) : 
     max(mx), 
     min(mn), 
     range(mx-mn) 
    {;} 

private: 
    const T max; 
    const T min; 
    const T range; 
} 

Iは最大値と最小許容値のデフォルト値を入れたいのですが、最小値は浮動小数点型と整数型のために同じではありません。

通常、私は

T min_val = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max(); 

を書くことができます私は

limitStats(T mx = std::numeric_limts<T>::max(), 
      T mn = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max()) 

はこのような何かを達成する方法はありデフォルトパラメータとして使用することはできませんことを発見しましたか?

答えて

3

デザインを考え直すことをおすすめします。あなたはlimitStatsで何をしようとしていますか?std::numeric_limitsは提供していませんか?

std::numeric_limitsのデザインの悪さを再現しないでください。たとえば、std::numeric_limits<double>::min()はひどく誤った名前です。最小二重は、最大二重の逆数です。 std::numeric_limitsは、表記の悪用とテンプレートの悪用です。私の意見では、もちろん。

minのあなたの考え方は間違っています。 limitStats<unsigned int>に関してあなたのデフォルトについて考えてみてください。

デフォルトでは、rangeは符号付き整数には無効です。署名されていないintの場合、limitStats<unsigned int>::minで問題を解決すると仮定すると、maxを複製します。浮動小数点型の場合は、limitStats<floating_point_type>::minの意味に応じて、無効であるか、maxを複製します。

デフォルト値を許可することは意味がありますか?デフォルトを提供せず、デフォルトのコンストラクタをprivate/unimplementedにするだけでも、この質問はありません。

2

あなたの問題であり、それらのどの伝えるのは難しいであることを、構文エラーやタイプミス非常に多くがあります。

numeric_limitsはテンプレートなので、numeric_limits<int>::is_integerまたはテンプレートタイプnumeric_limits<T>::max()としてアクセスします。

0

関数のシグネチャを持ってしようとしたときにDLLを作成しようとしたときに、私は様々なものをしようとしたとき、私はstdafx.hから#inlcude <windows.h>を削除することを決め

int 
GetARandomNum(
    int lowest = std::numeric_limits<int>::min(), 
    int highest = std::numeric_limits<int>::max()); 

のVisual StudioでWindowsに以下のように同じ問題がヒットし、物事はうまく構築され始めた。 VSでデフォルトで「stdafx.h」が選択されていて、それを含まないかどうかはビルドエラーに違いがないことを前提として、をstdafx'hからcppファイルに移動することに決めました。通常はdllmain.cppにのみあります。私はなぜWindows.hがC + 11ヘッダーを乱しているのか分かりませんが、以前同様の問題が発生しています。

関連する問題