мотивация: я хотел бы создать служебный класс, чтобы вместо необходимости писать:
if( someVal == val1 || someVal == val2 || someVal == val3 )
Я мог бы вместо этого написать:
if( is(someVal).in(val1, val2, val3) )
, который намного ближе к математическому «a является элементом (b, c, d)», а также сэкономил бы много печатания, когда имя переменной someVal длинное.
Вот код, который у меня есть (для 2 и 3 значений):
template<class T>
class is {
private:
T t_;
public:
is(T t) : t_(t) { }
bool in(const T& v1, const T& v2) {
return t_ == v1 || t_ == v2;
}
bool in(const T& v1, const T& v2, const T& v3) {
return t_ == v1 || t_ == v2 || t_ == v3;
}
};
Однако он не скомпилируется, если я напишу:
is(1).in(3,4,5);
вместо этого я должен написать
is<int>(1).in(3,4,5);
Что не так уж и плохо, но было бы лучше, если бы каким-то образом компилятор мог выяснить, что тип является int
без необходимости его явного указания.
Есть ли способ сделать это, или я застрял с указанием этого явно?