#include #include #include #include void loc(std::source_location l = std::source_location::current()) { std::cout << l.file_name() << ':' << l.line() << ' ' << l.function_name() << "\n"; } void function() { loc(); } auto lambda = [] { loc(); }; struct functor_type { void operator()() { loc(); } }; struct struct_type { void method() { loc(); } }; template decltype(auto) test(Callable &&c, Args &&...args) { std::decay_t callable = std::forward(c); std::tuple arguments = {std::forward(args)...}; return std::apply(callable, arguments); } int main() { test(function); test(lambda); test(functor_type{}); test(&struct_type::method, struct_type{}); }