ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Слайсы из Python

Open apolukhin opened this issue 4 years ago • 3 comments

Перенос предложения: голоса +4, -5 Aвтор идеи: dix75

Импользование слайсов из питона в с++ упростило бы написание С++ кода и мне видится их использование в двух различных местах.

  1. В качестве оператора operator[::] для стнадартных контейнеров и для пользовательских классов.
struct Vec {
   std::vector<int> vec;

   auto operator[::](int start, int end, int step) noexcept {
       return vec[start : end : step];
   }
   // or
   auto operator[::](int start, int end, int step) noexcept {
       std::vector<int> vec;
       for(int i = start; i != end; i += step)
           vec.push_back(i);
        return vec;   
   }
};

// usage
int main() {
   Vec vec;
   //... filling vec;
   for(auto i : vec[1:10:2])
     std::cout << i << std::endl;
   return EXIT_SUCCESS;
}
// or
int main() {
   for(auto i : [1:10:2])
     std::cout << i << std::endl;
   return EXIT_SUCCESS;
}
  1. В качестве оператора operator[::] для variadic template
template<class T>
inline void step(T&& t) noexcept {
  //
}

template<class... Args>
inline void unreverse(Args&&... args) noexcept {
   //
}

template<class... Args>
inline void reverse(Args&&... args) noexcept {
    // 
}

template<class... Args>
inline void fun(Args&&... args) noexcept {
    if constexpr(sizeof...(args) > 5)  // c++17
        reverse(std::forward<Args>(args[::-1])...); 
    step(std::forward<Args>(args[1:5])...);
}

Решить можно конечно и текущими средствами (std::forward_as_tuple and std::get), а также unpacking средствами.

P.s. Предпологаю, что такое предложение уже поступало, в таком случае хотелось бы услышать почему отказали.

apolukhin avatar Mar 15 '21 15:03 apolukhin

yndx-antoshkka, 9 января 2017, 11:55 Лично я - ярый противник всякого "синтаксического сахара" в ядре языка. Добавление таких вещей упрощает написание кода, но ведёт к абсолютно нечитаемому коду:

while (foo ~~ { @... }) {
    return {} unless foo != bar;
    foo += $&;
} else {
    static decltype(return) var;
    var += @ + ...;
    ++ g{hello}{word}[1:var:max];
    var;
}
{}

В случае с пинтоновскими слайсами есть большой недостаток: все три аргумета operator[::] имеют одинаковый тип и крайне легко ошибиться в порядке их передачи.

Однако, если добавлять функционал наподобие operator[::] не в ядро языка, а в виде свободных функций - у меня возражений не будет:

for (auto i : xrange(10))
    std::cout << i << std::endl;

for (auto i : creverse(vect))
    std::cout << i << std::endl;

for (auto i : crange(vect, 0, end, 2))
    std::cout << i << std::endl;

dix75, 9 января 2017, 12:26 yndx-antoshkka, У меня складывается ощущение, что большое кол-во нововведений в новый стандаот, это синтаксический сахар.

Дмитрий, 9 января 2017, 18:44 Каким будет тип результата воздействия данного оператора, например, на указатель?

// decltype(pointer[a:b:c]) = ?

Садченко Игорь, 28 марта 2017, 15:00 Слайсы уже есть в некотором проявлении в valarray. http://en.cppreference.com/w/cpp/header/valarray

apolukhin avatar Mar 15 '21 15:03 apolukhin

как вариант вместо срезов просто разрешить нецелочисленный аргумент в operator[] и тогда если уж так хочется то можно

obj[rng(1, 20, 1)]

Может и не так сахарно, но задачу решает, притом гибко - возвращай что хочешь, с другой стороны сводится к:

obj(rng(1, 20, 1))

Результат возвращается по желанию.

AKonia avatar May 04 '21 18:05 AKonia

вообщем то не понятно почему
https://wg21.link/p2128/github Multidimensional subscript operator. This allows the [] operator to take multiple arguments (e.g. matrix[i, j])

это хорошо

а добавить доп перегрузку по двоеточию [::] это плохо потому что даже ranges сейчас для слайсов не очень красиво и элегантно выглядят

может кто то попробует рядом с тем же пропозлом и этот пропозл протащить ?

marakew avatar Jan 03 '22 17:01 marakew