3

私は次のようなコードを持っています:

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

何らかの方法で N を制限する方法はありますか? 具体的には、N が 6 などの数値で除算された場合にのみコンパイルを許可したいと考えています。したがって、それは単なる型の制限ではないことが判明しました。推奨される方法は、ブーストなしでこれを行うことです。

4

2 に答える 2

7

1 つの 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 };
};
于 2012-05-03T19:15:48.610 に答える