Слайсы из Python
Перенос предложения: голоса +4, -5 Aвтор идеи: dix75
Импользование слайсов из питона в с++ упростило бы написание С++ кода и мне видится их использование в двух различных местах.
- В качестве оператора 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;
}
- В качестве оператора 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. Предпологаю, что такое предложение уже поступало, в таком случае хотелось бы услышать почему отказали.
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
как вариант вместо срезов просто разрешить нецелочисленный аргумент в operator[] и тогда если уж так хочется то можно
obj[rng(1, 20, 1)]
Может и не так сахарно, но задачу решает, притом гибко - возвращай что хочешь, с другой стороны сводится к:
obj(rng(1, 20, 1))
Результат возвращается по желанию.
вообщем то не понятно
почему
https://wg21.link/p2128/github
Multidimensional subscript operator. This allows the [] operator to take multiple arguments (e.g. matrix[i, j])
это хорошо
а добавить доп перегрузку по двоеточию [::] это плохо потому что даже ranges сейчас для слайсов не очень красиво и элегантно выглядят
может кто то попробует рядом с тем же пропозлом и этот пропозл протащить ?