限制整数模板参数

时间:2012-05-03 19:11:15

标签: c++ templates int restrictions

我有一个像这样的代码:

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

有没有办法以某种方式限制N?具体来说,我只想在N除以某个数字时允许编译,让我们说6。 所以事实证明这不仅仅是一种类型限制。 首选方法是在没有Boost的情况下执行此操作。

2 个答案:

答案 0 :(得分:5)

One 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 };
};

答案 1 :(得分:1)

我留在这里留待以后使用,因为我在发帖时在网上找不到好的例子。

带有概念的 C++20 方式:

template<int X, int Y>
concept is_evenly_divisible = X % Y == 0;

template <int N, int M> requires is_evenly_divisible<N, M>
struct XYZ
{
    enum class something { value = N };
};

XYZ<12, 6> thing; // OK
//XYZ<11, 6> thing; // Error

或者更短:

template <int N, int M> requires (N % M == 0)
struct XYZ
{
    enum class something { value = N };
};