我找不到编译时间隔检查器,所以我尝试了一些方法来开发自己应该输入有问题的值,最小值和最大值,以便检查器返回true如果有问题的值在两个端点之间。
我的第一种方法是能够比较整数,它看起来像这样:
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
类型特征断言LoEnd <= HiEnd
。
答案 0 :(得分:0)
您可以同时指定&#39; typename T&#39;和一个模板中的其他参数:
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(val)
:
#define in_interval(val, LoEnd, HiEnd) (is_in_interval<decltype(val), val, LoEnd, HiEnd>::value)
你可以按如下方式使用它:
cout << in_interval(3, 1, 10) << endl;
这一切都适用于我的VS2012