2016-06-15 2 views
3

コンパイル時に最大2つの定数値が見つかるテンプレートクラスが必要です。このような何か:std :: max、ただしテンプレートパラメータ用

template<enum_t e1, enum_t e2> 
struct max_of { static const enum_t value = SOMEHOW_MAX(e1, e2); }; 

enum_tが列挙型であり、max_of<x, y>::valuexyの最大値を同じにする必要があります。だから問題は:SOMEHOW_MAXの代わりに何を使用するのですか?コンパイル時にテンプレートのパラメータ値を比較することができないので、私はC++ 14の機能を使用することに制限されているので、ただstd::maxにすることはできません。作業を行いますが、はっきりとさえenum_t値の数が少ないため、むしろ冗長になり

template<> 
struct max_of<E_FIRST, E_SECOND> { static const enum_t value = E_SECOND; }; 

enum_tのカーディナリティが適度に小さい場合には、max_ofを実装するための1つの可能な方法は、そのようなテンプレート特殊、経由しています。テンプレートシステムをプログラム的に最大限に活用する方法はありますか?

+4

['std :: max'](http://en.cppreference.com/w/cpp/algorithm/max)の何が問題になりますか?それは 'constexpr'です。 – NathanOliver

+1

C++ 14以降では 'std :: max'を使うことができます – Slava

+1

boostは以下のように見えます:[http://www.boost.org/doc/libs/1_42_0/libs/integer/doc/html /boost_integer/minmax.html] – gcbenison

答えて

6

C++では、std::maxを使用してください。しかし、C++ 14に制限がない場合は、次の簡単なコードを参考にしてください。

template<enum_t A, enum_t B> 
struct max_of { 
    enum { value = A > B ? A : B}; 
}; 
3

2つの解決方法があります。単純な比較を使用し、三項演算子を使用して最大値を選択するか、std::maxを使用できます。これはC++ 14以上で動作します。

std::maxソリューション

template<enum_t e1, enum_t e2> 
struct max_of { 
    static constexpr auto value = std::max(e1, e2); 
}; 

マニュアルソリューション:

template<enum_t e1, enum_t e2> 
struct max_of { 
    static constexpr auto value = e1 > e2 ? e1 : e2; 
}; 

あなたは代わりにC++ 11にconstexpr 1の欠如を完了するために、独自の最大の機能を実装できます。

template<typename T> 
constexpr const T& max(const T& a, const T& b) { 
    return (a < b) ? b : a; 
} 
関連する問題