我有这样的代码:
template<int N, typename T>
class XYZ {
public:
enum { value = N };
//...
}
有没有办法以某种方式限制 N?具体来说,我只想在 N 除以某个数字(比如 6)时才允许编译。所以它不仅仅是类型限制。首选方法是在没有 Boost 的情况下执行此操作。
我有这样的代码:
template<int N, typename T>
class XYZ {
public:
enum { value = N };
//...
}
有没有办法以某种方式限制 N?具体来说,我只想在 N 除以某个数字(比如 6)时才允许编译。所以它不仅仅是类型限制。首选方法是在没有 Boost 的情况下执行此操作。
一种 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 };
};
我把它留在这里以备将来使用,因为在发布时我无法在网上找到一个很好的例子。
带有概念的 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 };
};