编译时间间隔检查器

Mat*_*ias 6 c++ templates compile-time c++11

我找不到编译时间隔检查器,所以我尝试了一些开发自己的方法,你应该输入有问题的值,最小值和最大值,这样如果有问题的值,检查器将返回true在两个端点之间.

我的第一种方法是能够比较整数,它看起来像这样:

template<int Val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant<bool, Val >= LoEnd && Val <= HiEnd>::type
{};
Run Code Online (Sandbox Code Playgroud)

对函数的调用看起来像

bool inside = is_in_interval<3, 1, 10>::value;
Run Code Online (Sandbox Code Playgroud)

这似乎有效.如果低端高于高端,我甚至可以在编译时使其失败:

template<int val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant< typename std::enable_if<LoEnd <= HiEnd, bool>::type, val >= LoEnd && val <= HiEnd>::type
{};
Run Code Online (Sandbox Code Playgroud)

为了能够比较我想出的任何价值:

template<typename T>
struct is_in
{
    template<T val, T LoEnd, T HiEnd>
    struct closed_interval : public std::integral_constant< typename std::enable_if<LoEnd <= HiEnd, bool>::type, val >= LoEnd && val <= HiEnd>::type
    {};
};
Run Code Online (Sandbox Code Playgroud)

然而,现在,这些电话变得更加模糊:

bool inside = is_in<int>::closed_interval<3,1,10>::value;
Run Code Online (Sandbox Code Playgroud)

但我仍然有能力使用enable_if,甚至可以添加更多(例如检查is_integral).

我的问题是,是否有可能使通用版本更容易调用,可能是从上面的非类型(3,1,10)中推断出类型(int)?

在旁注我可以使用:

template<typename T>
constexpr bool isInInterval3(T val, T LoEnd, T HiEnd)
{
    return val >= LoEnd && val <= HiEnd;
}
Run Code Online (Sandbox Code Playgroud)

但在该函数中,我认为我不能使用std::enable_if类型特征断言LoEnd <= HiEnd.

Yur*_*isk 0

您可以在一个模板中指定“typename T”和其他参数:

template<typename T, T val, T LoEnd, T HiEnd>
struct is_in_interval : public std::integral_constant<
typename std::enable_if<LoEnd <= HiEnd, bool>::type, val >= LoEnd && val <= HiEnd>::type
{};
Run Code Online (Sandbox Code Playgroud)

然后,您可以定义一个in_interval仅包含 val、LoEnd 和 HiEnd 参数的宏,该宏将is_in_interval使用第一个模板参数进行调用,例如decltype(val)

#define in_interval(val, LoEnd, HiEnd) (is_in_interval<decltype(val), val, LoEnd, HiEnd>::value)
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式使用它:

cout << in_interval(3, 1, 10) << endl;
Run Code Online (Sandbox Code Playgroud)

这一切都适用于我的 VS2012