Самый простой способ, который я знаю, это использовать лямбду для включения поиска перегрузки
std::invoke([](auto val){return std::sin(val);}, 0.0);
Позволит вам передать любое значение в invoke
, и тогда лямбда-тело будет обрабатывать фактический вызов, и тогда придет разрешение перегрузки.
Вы можете использовать макрос, чтобы абстрагировать лямбда-тело от вызова на invoke
, используя что-то вроде
#define FUNCTORIZE(func) [](auto&&... val) noexcept(noexcept(func(std::forward<decltype(val)>(val)...))) -> decltype(auto) {return func(std::forward<decltype(val)>(val)...);}
//...
std::invoke(FUNCTORIZE(std::sin), 0.0);