#include <iostream>
using namespace std;

struct intervall_range_proxy {};

template <typename T>
struct intervall
{
	T lower;
	T upper;
};

template <typename T>
intervall<T> operator*(T val, intervall_range_proxy)
{
	return {val, T()};
}

template <typename T>
intervall<T> operator*(intervall<T> a, T val)
{
	return {a.lower, val};
}

#define AND *intervall_range_proxy{}*

template <typename T>
bool operator+(T val, intervall<T> i)
{
	return i.lower <= val && val < i.upper;
}

#define BETWEEN +

int main() {
	auto i = 5 AND 7;
	cout << i.lower << ' ' << i.upper << '\n';
	cout << 6 BETWEEN i << '\n';
	cout << 2 BETWEEN 1 AND 10 << '\n';
	cout << 0 BETWEEN 1 AND 10 << '\n';
	cout << 1 BETWEEN 1 AND 10 << '\n';
}