4

範囲パラメーターを持つテンプレート統計クラスがあります。

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;
}

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

普通に書ける

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())

このようなことを達成する方法はありますか?

4

4 に答える 4

3

あなたはあなたのデザインを再考したいかもしれません。limitStatsあなたは提供しstd::numeric_limitsないあなたと何をしようとしていますか?

のデザインの悪さを再現しないでくださいstd::numeric_limits。たとえば、std::numeric_limits<double>::min()ひどく間違った名前が付けられています。最小のdoubleは、最大のdoubleの反数です。std::numeric_limits表記法の乱用とテンプレートの乱用です。もちろん、私の意見では。

のあなたの考えはmin形が悪いです。に関してデフォルトについて考えてくださいlimitStats<unsigned int>

デフォルトでrangeは、符号付き整数に対しては無効です。maxで問題を修正すると仮定すると、unsignedintの場合は複製されますlimitStats<unsigned int>::minmax浮動小数点型の場合、の意味に応じて、無効または複製されlimitStats<floating_point_type>::minます。

デフォルト値を許可することは意味がありますか?単にデフォルトを提供せず、デフォルトのコンストラクターをプライベート/未実装にすると、この質問すらありません。

于 2011-07-21T12:15:24.677 に答える
2

構文エラーやタイプミスが非常に多いため、どれが問題なのかを判断するのは困難です。

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

于 2011-07-21T12:04:57.053 に答える
1

使用する

boost::numeric::bounds<T>::lowest()

http://www.boost.org/doc/libs/1_33_1/libs/numeric/conversion/doc/bounds.htmlを参照してください。

于 2011-07-21T11:58:39.017 に答える
0

DLLを作成しようとしているときに、Visual StudioのWindowsで以下のような関数シグネチャを使用しようとすると、同じ問題が発生しました

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

#inlcude <windows.h>いろいろ試してみたところ、から外すことにしたところstdafx.h、うまくいき始めました。「stdafx.h」がVSでデフォルトで選択されており、それを含めなくてもビルドエラーに違いがないことを考えると、DLLプロジェクトの場合は通常必要な場所にあるcppファイルに単純に移動することにしまし#inlcude <windows.h>stdafx'hdllmain.cpp のみ。が C+11 ヘッダーをいじっている理由はわかりませんが、Windows.h以前にも同様の問題を見てきました。

于 2015-04-19T20:28:36.890 に答える