Использование boost:: посетитель с повышением :: вариант unique_ptr

#c #c 11 #boost #unique-ptr #boost-variant

#c #c 11 #повышение #уникальный-ptr #boost-вариант

Вопрос:

У меня есть два типа std::unique_ptr, которые хранятся внутри boost::variant. Я пытаюсь написать подкласс boost::static_visitor, чтобы извлечь постоянную ссылку на базовый объект, для которого созданы два варианта unique_ptr, для которых мой boost::variant является шаблоном. Настройка выглядит примерно так:

 using bitmap_flyweight_t = boost::flyweights::flyweight<allegro_bitmap_t>;
using image_bitmap_flyweight_t = boost::flyweights::flyweight<boost::flyweights::key_value<const char*, allegro_bitmap_t>>;

class bitmap_visitor : public boost::static_visitor<allegro_bitmap_t>
{
public:
    const allegro_bitmap_tamp; operator()(const std::unique_ptr<bitmap_flyweight_t> bitmap_ptr) const
    {
        return bitmap_ptr.get()->get();
    }

    const allegro_bitmap_tamp; operator()(const std::unique_ptr<image_bitmap_flyweight_t> bitmap_ptr) const
    {
        return bitmap_ptr.get()->get();
    }
};
  

Я могу поместить unique_ptrs в переменную-член boost::variant объекта при создании экземпляра, используя семантику перемещения, никаких жалоб компилятора нет. Однако, когда я пытаюсь получить доступ к типу variant с помощью вышеупомянутого visitor, компилятор жалуется, что он не может этого сделать, поскольку unique_ptr не поддается копированию.

Комментарии:

1. Вы пробовали принимать ссылку?

Ответ №1:

Примите постоянную ссылку на уникальный указатель.

 class bitmap_visitor : public boost::static_visitor<allegro_bitmap_t>
{
public:
    const allegro_bitmap_tamp; operator()(const std::unique_ptr<bitmap_flyweight_t>amp; bitmap_ptr) const
    {
        return bitmap_ptr.get()->get();
    }

    const allegro_bitmap_tamp; operator()(const std::unique_ptr<image_bitmap_flyweight_t>amp; bitmap_ptr) const
    {
        return bitmap_ptr.get()->get();
    }
};
  

Вот живая демонстрация игрушечного проекта.

Комментарии:

1. Ах, конечно. Я несколько новичок в использовании интеллектуальных указателей в своих проектах, поэтому я думаю, что идея передачи «ссылки на указатель» сбила меня с толку…

2. @Bitrex просто думайте о них как об обычных объектах. Вы не можете скопировать объект, не подлежащий копированию, и все 😉