#include <iostream>
#include <functional>
class Toto
{
public:
int test(float f) { std::cout << "Toto::test " << f << std::endl; return 0; }
} toto;
int test(float f)
{
std::cout << "test " << f << std::endl;
return 0;
}
namespace details
{
template <typename T, T t>
struct func_impl
{
void operator () () const { t(4.0f); }
};
template <typename T, int (T::*method)(float)>
struct func_impl<int (T::*)(float), method>
{
void operator () () const { (toto.*method)(5.0f); }
};
}
template <typename T, T t>
void func()
{
details::func_impl<T, t>{}();
}
int main(int, char**)
{
func<int(*)(float), &test>();
func<int (Toto::*)(float), &Toto::test>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCmNsYXNzIFRvdG8KewpwdWJsaWM6CiAgICBpbnQgdGVzdChmbG9hdCBmKSB7IHN0ZDo6Y291dCA8PCAiVG90bzo6dGVzdCAiIDw8IGYgPDwgc3RkOjplbmRsOyByZXR1cm4gMDsgfQp9IHRvdG87CgppbnQgdGVzdChmbG9hdCBmKQp7CiAgICBzdGQ6OmNvdXQgPDwgInRlc3QgIiA8PCBmIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9CgpuYW1lc3BhY2UgZGV0YWlscwp7Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVCB0PgoJc3RydWN0IGZ1bmNfaW1wbAoJewoJICAgIHZvaWQgb3BlcmF0b3IgKCkgKCkgY29uc3QgeyB0KDQuMGYpOyB9Cgl9OwoKCXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgKFQ6OiptZXRob2QpKGZsb2F0KT4KCXN0cnVjdCBmdW5jX2ltcGw8aW50IChUOjoqKShmbG9hdCksIG1ldGhvZD4KCXsKCSAgICB2b2lkIG9wZXJhdG9yICgpICgpIGNvbnN0IHsgKHRvdG8uKm1ldGhvZCkoNS4wZik7IH0KCX07CgoJCn0KCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVCB0Pgp2b2lkIGZ1bmMoKQp7CiAgICBkZXRhaWxzOjpmdW5jX2ltcGw8VCwgdD57fSgpOwp9CgppbnQgbWFpbihpbnQsIGNoYXIqKikKewogICAgZnVuYzxpbnQoKikoZmxvYXQpLCAmdGVzdD4oKTsKICAgIGZ1bmM8aW50IChUb3RvOjoqKShmbG9hdCksICZUb3RvOjp0ZXN0PigpOwp9