Информация об изменениях

Сообщение Re: Perfect forward object от 02.11.2022 8:52

Изменено 02.11.2022 9:11 rg45

Re: Perfect forward object
Здравствуйте, Videoman, Вы писали:

V>Что-то сегодня плохо голова соображает. А возможен ли сабж ?

V>Чего хочется: маленький некопируемый неперемещаемый объект, в который передается ссылка на любой другой (возможно некопируемый и неперемещаемый) тип. При вызове метода объекта ссылка передается дальше. Что-то типа такого:
V>
V>template <typename type_t>
V>struct object
V>{
V>    object(const type_t& type) ...
V>    object(const object& that) = delete;

V>    object& oparator(const object& that) = delete;

V>    const type_t& forward() const ... // as std::forward<>
V>};
V>

V>Тут всё преобразуется к ссылке на const type, а в идеале хотелось бы std::forward<> но для класса. Возможно ли такое в принципе? Если нет, какие возможны компромиссы?

Не уверен, что правильно понял задачу (std::forward работает для любых типов, в т.ч. и для классов).
Что-то типа такого?

template <typename type_t>
struct object
{
  const type_t& forward() const & { return m_t; }
  type_t&& forward() && { return std::move(m_t); }
};


Только для получения эффекта объект нужно захватывать по неконстантной или rvalue- ссылке, иначе обе версии будут эквивалентны.
Re: Perfect forward object
Здравствуйте, Videoman, Вы писали:

V>Что-то сегодня плохо голова соображает. А возможен ли сабж ?

V>Чего хочется: маленький некопируемый неперемещаемый объект, в который передается ссылка на любой другой (возможно некопируемый и неперемещаемый) тип. При вызове метода объекта ссылка передается дальше. Что-то типа такого:
V>
V>template <typename type_t>
V>struct object
V>{
V>    object(const type_t& type) ...
V>    object(const object& that) = delete;

V>    object& oparator(const object& that) = delete;

V>    const type_t& forward() const ... // as std::forward<>
V>};
V>

V>Тут всё преобразуется к ссылке на const type, а в идеале хотелось бы std::forward<> но для класса. Возможно ли такое в принципе? Если нет, какие возможны компромиссы?

Не уверен, что правильно понял задачу (Как понимать "std::forward<> но для класса"? std::forward работает для любых типов, в т.ч. и для классов).
Что-то типа такого?

template <typename type_t>
struct object
{
  const type_t& forward() const & { return m_t; }
  type_t&& forward() && { return std::move(m_t); }
};


Только для получения эффекта объект нужно захватывать по неконстантной или rvalue- ссылке, иначе обе версии будут эквивалентны.