C++ 编译时间间隔检查器

C++ 编译时间间隔检查器,c++,templates,c++11,compile-time,C++,Templates,C++11,Compile Time,我找不到编译时间隔检查器,所以我尝试了一些方法来开发一个自己的方法,您应该在其中输入有问题的值,最小值和最大值,这样,如果有问题的值在两个端点之间,检查器将返回true 我的第一个方法就是能够比较int,它看起来是这样的: template<int Val, int LoEnd, int HiEnd> struct is_in_interval : public std::integral_constant<bool, Val >= LoEnd && Va

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

我的第一个方法就是能够比较int,它看起来是这样的:

template<int Val, int LoEnd, int HiEnd>
struct is_in_interval : public std::integral_constant<bool, Val >= LoEnd && Val <= HiEnd>::type
{};
模板
结构在间隔中:public std::integral\u constant=LoEnd&&Val::type
{};
对函数的调用如下所示

bool inside = is_in_interval<3, 1, 10>::value;
bool inside=is_in_interval::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
{};
模板
结构是\u in_interval:public std::integral\u常量
为了能够比较我得出的任何值:

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
    {};
};
模板
结构是在
{
模板
struct closed_interval:public std::integral_constant
然而,现在,这些呼吁变得更加模糊:

bool inside = is_in<int>::closed_interval<3,1,10>::value;
bool inside=is_in::closed_interval::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;
}
模板
constexpr bool isInInterval3(T val、T LoEnd、T HiEnd)
{

return val>=LoEnd&&val您可以在一个模板中指定“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
{};
您可以按如下方式使用它:

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

您是否仍然可以使用
isInInterval3
进行编译时检查:
constexpr bool assert\u isIn(T const val,T const min,T const max){return val>=min&&val@dyp既不是SFINAE友好的方式,也不是一种优雅的方式来完成它?@Columbo作为一个基本的构建块,我认为OP的
isInterval3
是有用的。你可以在此基础上构建SFINAE和硬错误。正如我所说的,我认为我的
assert\u isIn
不是很有用与推断非类型模板参数类型相关的ons/某种接受所有类型的非类型参数。@Columbo顺便说一句,如果
也不是SFINAE(不是在直接上下文中,因为它在base子句中),则OP用
静态\u断言
替换它。(此外,检查
lo
不需要SFINAE IMHO,如果失败则为逻辑/编程错误。)
cout << in_interval(3, 1, 10) << endl;