cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
88 stars 0 forks source link

std::any_of_variadic #431

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +??, -?? Автор идеи: ??

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

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(функтор, аргументы...), может есть смысл подумать над ним?

apolukhin commented 3 years ago

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

Лягуха Пепе, 20 марта 2019, 15:40 Antervis,

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

Andrey Davydov, 21 марта 2019, 10:28

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

ranges::any_of({1, 2, 3}, a)

Лягуха Пепе, 22 марта 2019, 22:18 Andrey Davydov, мне кажется, что это будет не zero_cost

Andrey Davydov, 22 марта 2019, 23:20 Лягуха Пепе, 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

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

apolukhin commented 3 years ago

С компилятором поновее и с std::array код оптимизируется до одинакового состояния https://gcc.godbolt.org/z/rWvKjr5E8

std::ranges получается так же производительно: https://gcc.godbolt.org/z/8ba6vro5r

Кодга добавят std::ranges::contians , то будет ещё и коротко :)