2012-05-03 4 views
2

У меня есть код л, как это:Ограничить параметр целочисленный шаблон

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

Есть ли способ ограничить N каким-то образом? В частности, я хочу разрешить компиляцию только в том случае, если N делится на некоторое число, скажем 6. Так получилось, что это не просто ограничение типа. Предпочтительный способ - сделать это без Boost.

+3

Просто FYI, Boost.MPL уже содержит 100% логики, необходимой для чего-либо подобного, поэтому любой написанный вами код будет просто (возможно, плохим) дублированием. – ildjarn

ответ

4

Один C++ 03 Подход:

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 

Для C++ 11, вы можете избежать некоторых шаблонного и дать более хорошее сообщение об ошибке:

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