2

kMinValueC++ でいくつかのコードを書いているときに、タイプ X のコンポーネントの最小値はであり、最大値は であるという概念を表現したいと思いますkMaxValue。この目的のために、私は次のようなことをしました:

template <typename ComponentType>
struct CompTraits
{

};

template <>
struct CompTraits<unsigned char>
{
    typedef unsigned char ComponentType;
    enum{
        kMinValue = 0,
        kMaxValue = 255
    };              
};

そして、私は参照することができますCompTraits<unsigned char>::kMinValue。しかし、浮動データ型のトリックを理解できません。誰かがフロートについて同じことを定義するのを手伝ってくれませんか。

前もって感謝します。

4

3 に答える 3

5

std::numeric_limits定数の代わりに , を使用できますが、必要な場合はkMinValueand kMaxValue- このようなものを使用できます

C++03

template<>
struct CompTraits<float>
{
   static const float kMinValue;
   static const float kMaxValue;
};

const float CompTraits<float>::kMinValue = std::numeric_limits<float>::min();
const float CompTraits<float>::kMaxValue = std::numeric_limits<float>::max();

C++11

template<>
struct CompTraits<float>
{
   static constexpr float kMinValue = std::numeric_limits<float>::min();
   static constexpr float kMaxValue = std::numeric_limits<float>::max();
};

あなたの場合、単に使用する必要があります

template<>
struct CompTraits<float>
{
   static const float kMinValue = 0.0f;
   static const float kMaxValue = 1.0f;
};
于 2013-04-18T13:13:55.747 に答える
2

enumこれは、定数に使用するためです。列挙定数は整数のみです。

static const代わりにメンバー変数を使用することをお勧めします(またはstatic constexprC++11 コンパイラを使用している場合)。

于 2013-04-18T13:14:26.263 に答える
1

enumenumは整数値しか格納できないため、 を使用してこれらの値を定義することはできません。代わりに定数を使用できます。

template <>
struct CompTraits<double>
{
    typedef double ComponentType;
    static const double kMinValue = 0.;
    static const double kMinValue = 1.;          
};

また、標準の数値型については、C++ STL のstd::numeric_limitを調べることができます。

numeric_limits<unsigned char>::min()あなたの と同じことを行い、CompTraits<unsigned char>::kMinValueすべての数値型に対して実装されています。

また、 numeric_limit を独自のデータ型に特化できることにも注意してください。

namespace std {
    template<>
    struct numeric_limits<YourType>
    {
        static const bool is_specialized = true;
        /* assuming YourType has a constructor from double */
        static const YourType min() throw() { return 0. };
        static const YourType max() throw() { return 1. };
    };
}

このアプローチの正当性に疑問がある場合は、以下を参照してください。

« プログラムは、任意の標準ライブラリ テンプレートのテンプレートの特殊化を名前空間 std に追加できます。このような標準ライブラリ テンプレートの特殊化 (完全または部分的) は、宣言が外部リンケージのユーザー定義名に依存しない限り、および特殊化が元のテンプレートの標準ライブラリ要件を満たさない限り、未定義の動作をもたらします。 » C++ 2003から、§17.4.3.1/1

于 2013-04-18T13:13:41.027 に答える