Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Double g(double);






    // ошибка: какая версия g()?

    auto g1 = bind(g, _1);

    // ok (но выглядит ужасно)

    auto g2 = bind((double(*)(double))g, _1);

     

    Существует две версии метода bind(): одна версия показана выше, вторая «устаревшая» - требует явного указания типа возвращаемого значения:

    // явно указываем тип возвращаемого значения

    auto f2 = bind< int> (f, 7, 'c', _1);

    // f(7, 'c', 1.2);

    int x = f2(1.2);

     

    Необходимость (и широкая популярность) второй версии была обусловлена тем, что первую (более удобную в использовании) версию нельзя было реализовать в С++98.

    function – это тип, который может хранить практически что угодно, что можно вызвать с помощью синтаксиса вызова метода (...). В частности, результат вызова метода bind можно присвоить типу function. function использовать очень просто. Например:

    // создаем функтор

    function< float (int x, int y)> f;

    // получаем нечто, что можно вызвать с помощью ()

    struct int_div {

    float operator()(int x, int y) const {

    return ((float)x)/y;

    };

    };

    // присваиваем

    f = int_div();

    // вызываем функор

    cout < < f(5, 3) < < endl;

    // спокойно передаем куда-либо

    std:: accumulate(b, e, 1, f);

     

    Функцию-член можно рассматривать как свободную функцию с одним аргументом. Мы можем рассматривать function, как замену функторов стандартной библиотеки С++98: mem_fun_t, pointer_to_unary_function и т.д. Аналогичным образом, мы можем рассматривать bind(), как замену bind1() и bind2().

    См. также:

    • Standard: 20.7.12 Function template bind, 20.7.16.2 Class template function
    • Herb Sutter: Generalized Function Pointers. August 2003.
    • Douglas Gregor: Boost.Function.
    • Boost:: bind

     

    Unique_ptr

    · unique_ptr (определен в < memory>) и обеспечивает семантику строгого владения.

    o Владеет объектом, на который хранит указатель.

    o Не CopyConstructable и не CopyAssignable, однако MoveConstructible и MoveAssignable.

    o При собственном удалении (например, при выходе из области видимости (6.7)) уничтожает объект (на который хранит указатель) с помощью заданного метода удаления (с помощью deleter-а).

    · Использование unique_ptr дает:

    o безопасность исключений при работе с динамически выделенной памятью,

    o передачу владения динамически выделенной памяти в функцию,

    o возвращения динамически выделенной памяти из функции,

    o хранение указателей в контейнерах

    · «Это то, чем должен был быть auto_ptr» (но который мы не могли реализовать на С++98)

    unique_ptr реализован главным образом на основе rvalue-ссылок и семантике перемещения.

    Вот типовой фрагмент небезопасного с точки зрения исключений кода:

    X* f()

    {

    X* p = new X;

    // делаем что-то еще, возможна генерация исключения

    Return p;

    }

     

    Решение заключается в том, чтобы unique_ptr хранил указатель на память в куче:

    X* f()

    {

    // или {new X}, но не = new X

    unique_ptr< X> p(new X);

    // делаем что-то еще, возможна генерация исключения






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.