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 ответов

37 просмотров

какая проверка, что такой оператор есть для 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 зачем?

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта