Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Оператор для нескольких объектов

#cpp #cpp11


Есть ли в c++ возможность, позволяющая применять оператор для нескольких объектов?
Короче, что-то типа этого:

int i = 5;
if (i == { 1, 2, 3, 5 } ) // if (i == 1 || i == 2 ...)
{
    cout << "Hello world!" << endl;
}

    


Ответы

Ответ 1



В комментарий не помещаюсь... Чтоб одним оператором и именно == template class Has { private: vector data; public: explicit Has(initializer_list lst):data(lst){} bool operator ==(const T& value) const { return find(data.cbegin(),data.cend(),value) == data.cend(); } }; template Has in(initializer_list lst) { return Has(lst); } int main() { int i = 5; if (in({1,2,3,4,7,8}) == i) // Без in - if (Has({1,2,3,4,7,8}) == i) { cout << "Found\n"; } } Это путь чуть длиннее, но зато не нужно писать явно тип - ну, in. Если через функцию - то можно воспользоваться функцией с переменным числом аргументов. Но стоит ли эта овчинка выделки?

Ответ 2



Непосредственно такой синтаксис не поддерживается. Чтобы реализовать нечто подобное без создания дополнительных классов можно использовать std::set: if (std::set{1, 2, 3, 5}.count(i)) { // ... } Если компилятор поддерживает c++17, то тип элементов std::set может быть выведен из списка инициализации и явное указание не потребуется. if (std::set{1, 2, 3, 5}.count(i)) { // ... } Подробнее об этом есть в соответствующем вопросе: Новые правила выведения шаблонного типа в c++17

Комментариев нет:

Отправить комментарий