#include <iostream>
using namespace std;
template<typename T>
struct is_pure_func_ptr: public std::false_type {};
template<typename Ret, typename... Args>
struct is_pure_func_ptr<Ret(Args...)>: public std::true_type {};//detecting functions themselves
template<typename Ret, typename... Args>
struct is_pure_func_ptr<Ret(*)(Args...)>: public std::true_type {};//detecting function pointers
void f1()
{};
int f2(int)
{};
int f3(int, int)
{};
struct Functor
{
void operator ()()
{}
};
int main()
{
cout << is_pure_func_ptr<decltype(f1)>::value << endl; // output true
cout << is_pure_func_ptr<decltype(f2)>::value << endl; // output true
cout << is_pure_func_ptr<decltype(f3)>::value << endl; // output true
cout << is_pure_func_ptr<decltype(&f3)>::value << endl; // output true
cout << is_pure_func_ptr<Functor>::value << endl; // output false
cout << is_pure_func_ptr<char*>::value << endl; // output false
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgc3RydWN0IGlzX3B1cmVfZnVuY19wdHI6IHB1YmxpYyBzdGQ6OmZhbHNlX3R5cGUge307CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZXQsIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBzdHJ1Y3QgaXNfcHVyZV9mdW5jX3B0cjxSZXQoQXJncy4uLik+OiBwdWJsaWMgc3RkOjp0cnVlX3R5cGUge307Ly9kZXRlY3RpbmcgZnVuY3Rpb25zIHRoZW1zZWx2ZXMKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJldCwgdHlwZW5hbWUuLi4gQXJncz4KICAgIHN0cnVjdCBpc19wdXJlX2Z1bmNfcHRyPFJldCgqKShBcmdzLi4uKT46IHB1YmxpYyBzdGQ6OnRydWVfdHlwZSB7fTsvL2RldGVjdGluZyBmdW5jdGlvbiBwb2ludGVycwp2b2lkIGYxKCkKe307CgppbnQgZjIoaW50KQp7fTsKCmludCBmMyhpbnQsIGludCkKe307CgpzdHJ1Y3QgRnVuY3Rvcgp7CiAgICB2b2lkIG9wZXJhdG9yICgpKCkKICAgIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIGNvdXQgPDwgaXNfcHVyZV9mdW5jX3B0cjxkZWNsdHlwZShmMSk+Ojp2YWx1ZSA8PCBlbmRsOyAvLyBvdXRwdXQgdHJ1ZQogICAgY291dCA8PCBpc19wdXJlX2Z1bmNfcHRyPGRlY2x0eXBlKGYyKT46OnZhbHVlIDw8IGVuZGw7IC8vIG91dHB1dCB0cnVlCiAgICBjb3V0IDw8IGlzX3B1cmVfZnVuY19wdHI8ZGVjbHR5cGUoZjMpPjo6dmFsdWUgPDwgZW5kbDsgLy8gb3V0cHV0IHRydWUKICAgIGNvdXQgPDwgaXNfcHVyZV9mdW5jX3B0cjxkZWNsdHlwZSgmZjMpPjo6dmFsdWUgPDwgZW5kbDsgLy8gb3V0cHV0IHRydWUKICAgIGNvdXQgPDwgaXNfcHVyZV9mdW5jX3B0cjxGdW5jdG9yPjo6dmFsdWUgPDwgZW5kbDsgICAgICAvLyBvdXRwdXQgZmFsc2UKICAgIGNvdXQgPDwgaXNfcHVyZV9mdW5jX3B0cjxjaGFyKj46OnZhbHVlIDw8IGVuZGw7ICAgICAgICAvLyBvdXRwdXQgZmFsc2UKfQ==