Пространства имён
Варианты
Действия

std::shared_ptr::owner_before

Материал из cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
 
 
 
template< class T >
bool owner_before( const shared_ptr<T>& other) const;
template< class T >
bool owner_before( const std::weak_ptr<T>& other) const;

Сравнивает shared_ptr с other по полю «управляемый объект», и возвращает true, если первый «меньше» второго в некоем зависящем от реализации порядке. Два умных указателя «равны», если они оба пусты, или если они управляют одним и тем же объектом, даже если get() разные (например, указывают на разные поля одного объекта).

Это сравнение используется, чтобы использовать умные указатели в качестве ключей в ассоциативных контейнерах, обычно через std::owner_less.

Содержание

[править] Параметры

other std::shared_ptr или std::weak_ptr, с которым сравниваем

[править] Возвращаемое значение

true, если *this «меньше» other, иначе false. Типичная реализация сравнивает адреса управляемых объектов.

[править] Пример

#include <iostream>
#include <memory>
 
struct Foo {
    int n1;
    int n2;
    Foo(int a, int b) : n1(a), n2(b) {}
};
int main()
{
    auto p1 = std::make_shared<Foo>(1, 2);
    std::shared_ptr<int> p2(p1, &p1->n1);
    std::shared_ptr<int> p3(p1, &p1->n2);
 
    std::cout << std::boolalpha
              << "p2 < p3 " << (p2 < p3) << '\n'
              << "p3 < p2 " << (p3 < p2) << '\n'
              << "p2.owner_before(p3) " << p2.owner_before(p3) << '\n'
              << "p3.owner_before(p2) " << p3.owner_before(p2) << '\n';
 
    std::weak_ptr<int> w2(p2);
    std::weak_ptr<int> w3(p3);
    std::cout
//              << "w2 < w3 " << (w2 < w3) << '\n'  // won't compile
//              << "w3 < w2 " << (w3 < w2) << '\n'  // won't compile
              << "w2.owner_before(w3) " << w2.owner_before(w3) << '\n'
              << "w3.owner_before(w2) " << w3.owner_before(w2) << '\n';
 
}

Вывод:

p2 < p3 true
p3 < p2 false
p2.owner_before(p3) false
p3.owner_before(p2) false
w2.owner_before(w3) false
w3.owner_before(w2) false

[править] См. также

предоставляет упорядочивание смешанного типа, основанное на владении объектом для разделяемых и слабых указателей
(шаблон класса) [править]