Студопедия

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

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

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






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 :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.