#include <iostream>
#include <string>

template <typename Ret, typename... Args>
void Register(const std::string& s, Ret(*)(Args...))
{
    std::cout << "register function " << s << std::endl;
}

template <typename Lambda>
void Register(const std::string& s, const Lambda&f)
{
    // convert non capturing lambda into function pointer
    Register(s, +f);
}

int foo() { return 0; }

int main()
{
    Register("normal func", foo);
    Register("lambda", [](int n){return 42 + n;});
}
