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

Всем добрый вечер. Есть вот такой код : template<class T> [[maybe_unused]] constexpr decltype(auto)

sum(const T& first, const T& second, std::promise<T>& result)
{
result.set_value(first + second);
return std::forward<T>(first+second);
}

Хочу добавить некоторое сравнение, похожее на std::enable_if, но мне нужно, чтобы была проверка именно оператора +. Сможете подсказать по этому поводу?

19 ответов

10 просмотров

какая проверка, что такой оператор есть для first и second?

ssf Defs
Да

на концептах или sfinae?

ssf-Defs Автор вопроса
Denis P
на концептах или sfinae?

Вообще, если есть возможность, то на обеих версиях. Так как хотел в скором времени обе из них рассмотреть(идиому и концепты)

ssf Defs
Вообще, если есть возможность, то на обеих версиях...

на концептах наверное как-то так template<typename T1, typename T2> concept Addable = requires(T1 t1, T2 t2) { t1 + t2; }; template<typename T1, typename T2> void f1(T1 t1, T2 t2) requires Addable<T1, T2> { // ... }

ssf-Defs Автор вопроса
Denis P
на концептах наверное как-то так template<typenam...

Блин, реально классно выглядит это на концептах

ssf Defs
Вообще, если есть возможность, то на обеих версиях...

а на sfinae можно так template<typename T1, typename T2, typename = void> inline constexpr bool is_addable_v{}; template<typename T1, typename T2> inline constexpr bool is_addable_v< T1, T2, std::void_t< decltype( std::declval<T1>() + std::declval<T2>() ) > > = true; template<typename T1, typename T2> using enable_if_addable = std::enable_if_t< is_addable_v<T1, T2>>; template<typename T1, typename T2, enable_if_addable<T1, T2>* = nullptr> void f2(T1 t1, T2 t2) { } может можно и проще конечно, пусть местные шаблонные мастера ещё глянут)

template<class T> [[maybe_unused]] constexpr auto sum(const T& first, const T& second) -> decltype(std::forward<T>(first+second)) { return std::forward<T>(first+second); }

ssf-Defs Автор вопроса
Ofee Oficsu
template<class T> [[maybe_unused]] constexpr auto ...

Уже решили проблему, но спасибо

Ofee Oficsu
template<class T> [[maybe_unused]] constexpr auto ...

не понятно чем это лучше варианта с constexpr decltype(auto) ...

Denis P
не понятно чем это лучше варианта с constexpr decl...

Тем, что здесь есть проверка на наличие операции сложения с падением в SFINAE-контексте в противном случае

А вообще, std::forward здесь совершенно некорректен — он принимает в качестве аргумента выражение, никак не связнное с явно указанным типом. С практической точки зрения он здесь, вероятно, и вовсе не имеет смысла

ssf-Defs Автор вопроса
ssf-Defs Автор вопроса
ssf Defs
А если у меня там будет rvalue-ref?

также могу проверить перед тем, как заюзать std::is_move_constructible

ssf Defs
А если у меня там будет rvalue-ref?

T им никогда не будет, поскольку в параметрах функции явно указано, что там const T&. Кроме того, даже если first+second вернёт rvalue, это никак не зависит от T. Вы бы, наверное, хотели написать что-то вроде return std::forward<decltype(first+second)>(first+second);, но это равнозначно first+second

ssf-Defs Автор вопроса
Слава
А std::forward зачем?

Я его по невнимательности скопипастил, ниже указал на то, что он ни у меня, ни в теле функции в таком виде не работает и не нужен

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
Подскажите, есть какие-то события создания/уничтожения у TFrame по типу TForm (OnCreate и OnClose/OnDestroy) ? Как отловить создание TFrame и "перед" уничтожением. На Tframe р...
Денис
8
Карта сайта