std::any_of_variadic

Бычок Дристунок
Бычок Дристунок

Часто приходится писать код, типа

if ((a == 1) || (a == 2) || (a == 3)) { ... };

Мне кажется, что что-то типа if (std::any_of_variadic(a, 1, 2, 3)) { ... }; этот код бы достаточно сократило.

+Для консистентности, можно было бы добавить all_of_variadic и none_of_variadic.

 

Существует еще вариант, который очень близок к стандартной библиотеке, такой как std::something_of_variadic(функтор, аргументы...), может есть смысл подумать над ним?

4
рейтинг
6 комментариев
Antervis

в языке есть fold expressions, для вариадик пака можно сделать if (((a == args) && ...)).

Antervis
Бычок Дристунок

Antervis, я хочу в подобные мини-хелперы засовывать не вариадик-пак. а нормальные переменные. А вон внутри, да, вариадик пак и фолд экспрешшены, по идее

Бычок Дристунок
Andrey Davydov

А так не подойдет?

ranges::any_of({1, 2, 3}, a)
Andrey Davydov
Бычок Дристунок

Andrey Davydov, мне кажется, что это будет не zero_cost

Бычок Дристунок
Andrey Davydov

JordanRudess, для этих 2-х функций

namespace v1 {
    template<typename T, typename... Ts>
    bool any_of(T t, Ts... ts) {
        return ((t == ts) || ...);
    }

    bool test(int a, int b, int c, int d) {
        return any_of(a, b, c, d);
    }
}

namespace v2 {
    template<typename T>
    bool any_of(T x, std::initializer_list<T> ys) {
        for (T y : ys) {
            if (x == y)
                return true;
        }
        return false;
    }

    bool test(int a, int b, int c, int d) {
        return any_of(a, { b, c, d });
    }
}

clang выдает дословно совпадающий assembler: https://gcc.godbolt.org/z/JVo6Nr

Andrey Davydov
Бычок Дристунок

Andrey Davydov, ну, де-факто это закрывает мой юзкейс, но, хочется чего-то... почище? :)
Правда, я не уверен, что "почище" это достаточная мотивация для комитета.

 

Бычок Дристунок
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения