c++ - 编译时间间隔检查器

标签 c++ templates c++11 compile-time

我找不到编译时间间隔检查器,所以我尝试了一些方法来开发一个自己的方法,您应该在其中输入有问题的值、最小值和最大值,以便检查器在有问题的值在两个端点之间。

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

template<int Val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant<bool, Val >= LoEnd && Val <= HiEnd>::type
{};

对该函数的调用看起来像

bool inside = is_in_interval<3, 1, 10>::value;

这似乎奏效了。 如果低端高于高端,我什至可以让它在编译时失败:

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

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

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

然而,现在调用变得更加模糊:

bool inside = is_in<int>::closed_interval<3,1,10>::value;

但我仍然可以使用 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;
}

但在那个函数中我认为我不能使用 std::enable_if输入 trait 断言 LoEnd <= HiEnd .

最佳答案

您可以在一个模板中同时指定“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
{};

然后,您可以定义一个只有 val、LoEnd 和 HiEnd 参数的宏 in_interval,它将调用带有第一个模板参数的 is_in_interval,例如,decltype(值):

#define in_interval(val, LoEnd, HiEnd) (is_in_interval<decltype(val), val, LoEnd, HiEnd>::value)

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

cout << in_interval(3, 1, 10) << endl;

这一切都适用于我的 VS2012

关于c++ - 编译时间间隔检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27452322/

相关文章:

c++ - 将消息添加到断言

c++ - 销毁返回对象

c++ - 在编译时检查函数是否有外部链接

c++ - 具有继承性的模板参数推断

c++ - int&& 和 template<class T> T&& 的区别

c++ - 矩阵类和 operator= 重载

c++ - Hook dll中的特定函数

c++ - 关于转换运算符和operator()

c++ - 为什么 VS2015 中模板相关的嵌套类型名称不需要 typename 关键字?

c++ - 如何更新 std::vector<pair<int, int>> 中最近输入的元素?