170 похожих чатов

Template <class T> struct A { void f(T arg) {

??? }
};
как правильно внутри такой конструкции форвардить аргументы? мне кажется, ни forward<T>, ни move не дадут ожидаемого результата.
для A<B>::f хочу мувать аргумент, для A<const B&>::f передавать по ссылке далее

14 ответов

5 просмотров

template <class T> struct A { template <same_as<T> T_> void f(T_&& arg) { ... } }; ?

Alexander-Karaev Автор вопроса
Ofee Oficsu
template <class T> struct A { template <same_as<...

нет, метод не должен быть шаблонным, у него строго зафиксированы аргументы

Alexander-Karaev Автор вопроса

А что не так с форвардом?

Alexander-Karaev Автор вопроса
Constantine Drozdov
А что не так с форвардом?

я его использовал только в контексте T&&, поэтому сомневаюсь

Точно так же принимаем T&&. В таком случае, сжатие ссылок должно работать всё ещё правильно

Alexander Karaev
я его использовал только в контексте T&&, поэтому ...

А, это нормально, просто сопоставь табличку.

Alexander-Karaev Автор вопроса
Ofee Oficsu
Точно так же принимаем T&&. В таком случае, сжатие...

да нельзя принимать T&&, потому что тогда для A<int> сигнатура метода будет void f(int&&)

Alexander Karaev
да нельзя принимать T&&, потому что тогда для A<in...

Может, что-то такое? template <class T> using try_add_ref = typename std::conditional<std::is_reference_v<T>, T&&, T>::type; template <class T> struct A { void f(try_add_ref<T> arg) { } };

Alexander-Karaev Автор вопроса
Ofee Oficsu
Может, что-то такое? template <class T> using try...

какой смысл от этой конструкции?

Alexander Karaev
какой смысл от этой конструкции?

Для ссылочных аргументов мы принимаем тип по форвард-ссылке, получая при сжатии ссылок либо lvalue, либо rvalue ref, для нессылочных типов принимаем по значению

Alexander-Karaev Автор вопроса
Ofee Oficsu
Для ссылочных аргументов мы принимаем тип по форва...

принимать мне нужно именно T в том виде, в котором я прописал в шаблоне класса (если будет проще: template <class... Args> struct func { void operator()(Args...); }, просто потом нужно: T -> T&& T& -> T& const T& -> const T& T&& -> T&&, где T - не forwarding ref, а конкретный тип

Alexander Karaev
принимать мне нужно именно T в том виде, в котором...

Вроде если ты тут форвард сделаешь всё збс будет

Alexander Karaev
принимать мне нужно именно T в том виде, в котором...

Вроде бы, всё правильно За исключением того, что пришлось бороться с copy elision странным образом

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта