Мне кажется, что std::conditional
должен решить все ваши проблемы
template <typename T>
void brol (T t)
{
using U = std::conditional_t<std::is_integral_v<T>, Integer<T>, Floating<T>>;
U u{t};
auto stuff = [] (U & u) -> void { u *= 2; };
stuff(u);
}
В любом случае, проблема с лямбдой может быть решена и с помощью общей лямбды (как указано rustyx)
auto stuff = [] (auto & u) -> void { u *= 2; };
Что касается финала, если в C ++ 17 (вы используете std::is_integral_v
, значит, вы используете C ++ 17), вы также можете использовать if constexpr
в аналогичных условиях
if constexpr (std::is_integral_v<T>)
stuff(i);
else
stuff(f);
но остается проблема, которую вы должны определить i
или f
.