Код: Выделить всё
template
constexpr auto wrap(Fn fn)
{
return [fn](typename lambda_traits::Args&& t) { return std::apply(fn, std::forward(t)); };
}
Поэкспериментировав с возможными решениями лямбда_traits, я наконец схитрил и делегировал выведение типа std::function.
Код: Выделить всё
template struct lambda_traits;
template< class R, class ... A >
struct lambda_traits
{
using Ret = R;
using Args = std::tuple;
constexpr lambda_traits(std::function);
};
template< class R, class ... A >
lambda_traits(std::function) -> lambda_traits;
template
struct lambda_traits : decltype(lambda_traits(std::function(std::declval())))
{
};
Код: Выделить всё
std::functionЕще одна проблема: в некоторых случаях неявные преобразования не происходят, возможно, где-то что-то не так с типами. Можете ли вы это исправить?
Это работает:
Код: Выделить всё
static_assert(
wrap([](std::string s) { return s.size();})(std::tuple{"abc"}) == 3);
Код: Выделить всё
static_assert(
wrap([](const std::string& s) { return s.size();})(std::tuple{"abc"}) == 3);
Подробнее здесь: https://stackoverflow.com/questions/787 ... parameters