Слайсы из Python

dix75
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;
}

2. В качестве оператора 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. Предпологаю, что такое предложение уже поступало, в таком случае хотелось бы услышать почему отказали.

 

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

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;
yndx-antoshkka
dix75
yndx-antoshkka,
У меня складывается ощущение, что большое кол-во нововведений в новый стандаот, это синтаксический сахар.
dix75
dmitriy@izvolov.ru
Каким будет тип результата воздействия данного оператора, например, на указатель?

// decltype(pointer[a:b:c]) = ?
dmitriy@izvolov.ru
Садченко  Игорь
Слайсы уже есть в некотором проявлении в valarray.
en.cppreference.com/w/cpp/header/valarray
Садченко Игорь
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).