Могу ли я использовать интеллектуальные указатели C ++ 11 в качестве типа возврата сообщения в C ++ Actor Framework?

Когда я использую unique_ptr в качестве возвращаемого типа, я получаю ошибку компилятора C2280:

'caf::detail::tuple_vals<std::unique_ptr<A,std::default_delete<_Ty>>>::tuple_vals(const caf::detail::tuple_vals<std::unique_ptr<_Ty,std::default_delete<_Ty>>> &)': attempting to reference a deleted function  include\caf\detail\tuple_vals.hpp   102

Вот пример кода, который иллюстрирует проблему (измененный из одного из примеров C ++ Actor Framework):

#include <iostream>
#include "caf/all.hpp"
using namespace caf;
using namespace std;

class A
{
public:
int a;

A(int a)
{
this->a = a;
}
};

using a_type = typed_actor<replies_to<int>::with<unique_ptr<A>>>;

a_type::behavior_type a_behavior(a_type::pointer self)
{
return
{
[self](const int& a) -> unique_ptr<A>
{
return make_unique<A>(5);
}
};
}

void tester(event_based_actor* self, const a_type& testee)
{
self->link_to(testee);
// will be invoked if we receive an unexpected response message
self->on_sync_failure(
[=]
{
aout(self) << "AUT (actor under test) failed" << endl;
self->quit(exit_reason::user_shutdown);
});
self->sync_send(testee, 5).then(
[=](unique_ptr<A> a)
{
if(a->a == 5)
{
aout(self) << "AUT success" << endl;
}

self->send_exit(testee, exit_reason::user_shutdown);
}
);
}

5

Решение

CAF требует, чтобы каждый тип сообщения регулярный. Это подразумевает, что он должен предоставить конструктор копирования, который std::unique_ptr не имеет Поэтому компилятор жалуется.

Сообщения имеют реализацию копирования при записи. Вы можете дешево скопировать одно сообщение, так как оно просто увеличивает внутреннее количество ссылок. В любой момент вы можете выполнить постоянный доступ к элементам сообщения. Часть «запись» при копировании только при записи включается, если счетчик ссылок сообщения больше 1 а также Вы запрашиваете неконстантный доступ. В этот момент среда выполнения вызывает конструктор копирования данного типа для создания нового сообщения.

Если CAF безоговорочно выполнит эту копию, независимо от количества ссылок, то будет невозможно эффективно поддерживать программирование потока данных, когда субъект получает сообщение, изменяет его содержимое и переходит к следующему этапу.

Думайте о сообщениях как о контейнерах указателей: содержащиеся элементы размещаются в бесплатном хранилище. Хранение указателя в сообщении обычно является недостатком дизайна. Двойная упаковка также подчеркивает распределитель без необходимости.

Поскольку вы можете гибко нарезать сообщения, вы можете создать отдельное сообщение, а затем использовать его в различных контекстах.

4

Другие решения

Да, C ++ Actor Framework допускает использование умных указателей в ответных сообщениях, но не в форме unique_ptr,

В настоящее время реализация C ++ Actor Framework делает копию сообщения и разыменовывает unique_ptr, вызывая ошибку компилятора.

Вместо того, чтобы использовать unique_ptrиспользовать shared_ptr вместо. Счетчик ссылок будет равен 2 при изменении кода примера вопроса. Я также использовал пользовательскую функцию удаления, чтобы убедиться, что память освобождается, как и ожидалось, несмотря на создание второго share_ptr,

2

По вопросам рекламы [email protected]