2012-05-03 8 views
2

を制限:私はこのようなコードをなめらかにしまし整数テンプレートパラメータ

template<int N, typename T> 
class XYZ { 
public: 
    enum { value = N }; 
    //... 
} 

何らかの方法でNを制限する方法はありますか?具体的には、Nをいくつかの数値で割った場合にのみ、コンパイルを許可したいと思います。つまり、6としましょう。 これは型制限ではないことが判明しました。 好きな方法はBoostなしでこれを行うことです。

+3

を、Boost.MPLがすでに含まれていますこのようなものには100%のロジックが必要なので、書くコードは単純に(おそらく貧弱な)重複になります。 – ildjarn

答えて

4

一つのC++ 03の方法:C++ 11の場合

template<int X, int Y> 
struct is_evenly_divisible 
{ 
    static bool const value = !(X % Y); 
}; 

template<int N, typename T, bool EnableB = is_evenly_divisible<N, 6>::value> 
struct XYZ 
{ 
    enum { value = N }; 
}; 

template<int N, typename T> 
struct XYZ<N, T, false>; // undefined, causes linker error 

、あなたには、いくつかの決まり文句を避け、よりよいエラーメッセージを与えることができます:ちょうどFYI

template<int N, typename T> 
struct XYZ 
{ 
    static_assert(!(N % 6), "N must be evenly divisible by 6"); 
    enum { value = N }; 
}; 
関連する問題