Пока я обнаружил, что могу просто сделать это:
Q_DECLARE_METATYPE(shared_ptr<SomeClass>)
qRegisterMetaType<shared_ptr<SomeClass> >();
qRegisterMetaType<shared_ptr<SomeClass> >("std::shared_ptr<SomeClass>const&");
Я пытаюсь проверить, действительно ли это работает правильно. Документация здесь не ясно, что на самом деле происходит. Похоже, что ссылочный тип const в сигнале / слоте будет просто маршалироваться как нормальный shared_ptr<SomeClass>
, что здесь вполне нормально. Однако было бы неплохо иметь какую-то гарантию, что это должно работать как таковое.
У меня такое ощущение, что простая shared_ptr<SomeClass>
версия - это все, что нужно, и это пространство имен boost
, которое мешает сигналам. Вторая версия появляется только для регистрации сигнала в глобальном пространстве имен для более легкого использования.
Из тестирования я могу подтвердить, что часть const &
, как упоминалось, полностью игнорируется в соединениях с очередями. Каждый подключенный слот получает новую копию объекта. Это очень неудачно. (
Дальнейшие тесты показывают, что &
используется для слота, но необычным образом. Копия объекта все еще создается для подключенного к очереди соединения, но если вы не используете ссылку, для вызова будет создана другая копия.
Таким образом, хотя каждый connect
в конечном итоге будет копировать данные для соединения в очереди, ссылки все равно немного помогают. А также, если у вас есть несколько сигналов, отправленных локально (тот же поток), вы можете избежать еще большего копирования.