cpp-ru / ideas

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

Добавить std::left( container, number) , std::right(container, number) #434

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

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

у многих языках и SQL есть удобная функция left , right .

например,

std::string name = "Hello, world";

std::string hello = left(name, 5); // 'Hello'   , name.substr(0, 5)

std::string world = right(name, 5); // 'world'  ,  name.substr( name.length() - 5, 5);
apolukhin commented 3 years ago

Antervis, 26 апреля 2019, 16:04 далеко для всех языков начало/конец строки слева/справа соответственно )

Айдар Фаттахов, 14 мая 2019, 14:47

std::string_view::remove_prefix
std::string_view::remove_suffix

Удалённый пользователь, 22 мая 2019, 09:04 Представте, нужен последный 9 символ строка. Сейчас пишем.

//Current implementation.   'phone' variable used 5 times(!!)
std::string phone = read_from_outside();
if (phone.length() > 9 ) {
    phone = phone.substr( phone.length() - 9 ) ;
}

//with left, right,   'phone' variable used single, ready to use.
std::string phone = right( read_from_outside(), 9 ) ; // right no more 9 symbols.

Владимир Топунов, 19 июля 2019, 19:26 left, right нужно добавить в span и string_view. remove_prefix, remove_suffix - не const и плохо сочетаются с функциональным стилем

Владимир Топунов, 19 июля 2019, 21:25

    constexpr span left(size_t size) const noexcept
    {
        return { span_data, size };
    }

    constexpr span right(size_t size) const noexcept
    {
        return { span_data + span_size - size, size };
    }
apolukhin commented 3 years ago

std::ranges уже отчасти позволяют это делать https://gcc.godbolt.org/z/4xKW9fP11

Где-то в районе C++23 добавят std::ranges::take_last http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2214r0.html и std::ranges::to. Тогда запись будет совсем короткой:

#include <string>
#include <iostream>
#include <ranges>

int main() {
    std::string name = "Hello, world";
    auto hello = name | std::views::take(5) | to<std::string_view>;
    auto world = name | std::views::take_last(5) | to<std::string_view>;

    std::cout << hello;
    std::cout << '\n';
    std::cout << world;
}
apolukhin commented 8 months ago

std::ranges::to добавили в C++23, std::views::take_last не успел в C++23