#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;});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUuLi4gQXJncz4Kdm9pZCBSZWdpc3Rlcihjb25zdCBzdGQ6OnN0cmluZyYgcywgUmV0KCopKEFyZ3MuLi4pKQp7CiAgICBzdGQ6OmNvdXQgPDwgInJlZ2lzdGVyIGZ1bmN0aW9uICIgPDwgcyA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBMYW1iZGE+CnZvaWQgUmVnaXN0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IExhbWJkYSZmKQp7CiAgICAvLyBjb252ZXJ0IG5vbiBjYXB0dXJpbmcgbGFtYmRhIGludG8gZnVuY3Rpb24gcG9pbnRlcgogICAgUmVnaXN0ZXIocywgK2YpOwp9CgppbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoKaW50IG1haW4oKQp7CiAgICBSZWdpc3Rlcigibm9ybWFsIGZ1bmMiLCBmb28pOwogICAgUmVnaXN0ZXIoImxhbWJkYSIsIFtdKGludCBuKXtyZXR1cm4gNDIgKyBuO30pOwp9Cg==