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, но мне нужно, чтобы была проверка именно оператора +. Сможете подсказать по этому поводу?
какая проверка, что такой оператор есть для first и second?
на концептах или sfinae?
Вообще, если есть возможность, то на обеих версиях. Так как хотел в скором времени обе из них рассмотреть(идиому и концепты)
на концептах наверное как-то так 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> { // ... }
Блин, реально классно выглядит это на концептах
а на 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); }
Уже решили проблему, но спасибо
не понятно чем это лучше варианта с constexpr decltype(auto) ...
Тем, что здесь есть проверка на наличие операции сложения с падением в SFINAE-контексте в противном случае
А вообще, std::forward здесь совершенно некорректен — он принимает в качестве аргумента выражение, никак не связнное с явно указанным типом. С практической точки зрения он здесь, вероятно, и вовсе не имеет смысла
А если у меня там будет rvalue-ref?
также могу проверить перед тем, как заюзать std::is_move_constructible
T им никогда не будет, поскольку в параметрах функции явно указано, что там const T&. Кроме того, даже если first+second вернёт rvalue, это никак не зависит от T. Вы бы, наверное, хотели написать что-то вроде return std::forward<decltype(first+second)>(first+second);, но это равнозначно first+second
Я думал потом сделать специализацию
Type index забыль
А std::forward зачем?
Я его по невнимательности скопипастил, ниже указал на то, что он ни у меня, ни в теле функции в таком виде не работает и не нужен
Обсуждают сегодня