cpp-ru / ideas

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

<algorithm> который можно использовать в constexpr #306

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

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

Необходимо для рефлексии, метаклассов и упрощения метапрограммирования.

Алгоритмы не используещие swap помечаются как constexpr в https:/wg21.link/p0202

Оставшиеся алгоримы, использующие swap, помечаются как constexpr в https:/wg21.link/p0879

apolukhin commented 3 years ago

Andrey Davydov, 4 мая 2018, 10:34 Общий вопрос: насколько актуально менять функции из сейчас, а не ждать нового дивного std2 с ranges? Мне не нравится, то что сейчас функции принимающие пару итераторов ожидают, что они будут одного типа, в то время как для range-based for loop разрешили begin-, end-итераторам быть разного типа. В результате в C++17 для некоторых своих классов я могу написать

int sum(Range && range) {
  int res = 0;
  for (int i : range)
    res += i;
  return i;
}

но не могу

int sum(Range && range) {
  return std::accumulate(range.begin(), range.end(), 0);
}

В Ranges TS я знаю эта проблема исправлена, а на сколько, как Вы считатете, актуально было бы исправлять

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

на

template< class InputIt, class Sentinel, class T >
T accumulate( InputIt first, Sentinel last, T init );

в С++20?

yndx-antoshkka, 4 мая 2018, 18:34 Вы подняли много интресных вопросов:

У меня есть необоснованный страх, что Ranges не успеют попасть в C++20. Поэтому constexpr добавляю к существующему . Однако, надо такие же constexpr добавить и для Ranges. Займусь этим в скором времени.

Исправлять имеющиеся алгоритмы не опираясь на Ranges комитет точно не будет. Это огромная работа и такое исправление будет дублировать работу по Ranges. В итоге просто оба предложения замедлятся.

Интереснее другое: можно ли Ranges влить в namespace std, чтобы существующий код начал использовать Ranges из коробки, а алгоритмы не дублировались в двух разных namespace. Задам этот фопрос авторам Ranges.