#include <cstdint>
#include <functional>
#include <iostream>
#include <type_traits>
template<class F>
struct function_traits;
// function pointer
template<class... Args>
struct function_traits<int (*)(Args...)>
: public function_traits<int (Args...)> {};
template<class... Args>
struct function_traits<int (Args...)>
{
static constexpr std::size_t arity = sizeof...(Args);
};
template <typename Func,
typename std::enable_if_t<function_traits<Func>::arity == 3>* = nullptr>
bool call_read(Func read)
{
return true;
}
template <typename Func,
typename std::enable_if_t<function_traits<Func>::arity == 1>* = nullptr>
bool call_read(Func read)
{
return true;
}
int foo(int x, int y, int z)
{
return 0;
}
int main()
{
call_read(foo);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlPGNsYXNzIEY+CnN0cnVjdCBmdW5jdGlvbl90cmFpdHM7CiAKLy8gZnVuY3Rpb24gcG9pbnRlcgp0ZW1wbGF0ZTxjbGFzcy4uLiBBcmdzPgpzdHJ1Y3QgZnVuY3Rpb25fdHJhaXRzPGludCAoKikoQXJncy4uLik+CiAgOiBwdWJsaWMgZnVuY3Rpb25fdHJhaXRzPGludCAoQXJncy4uLik+IHt9OwogCnRlbXBsYXRlPGNsYXNzLi4uIEFyZ3M+CnN0cnVjdCBmdW5jdGlvbl90cmFpdHM8aW50IChBcmdzLi4uKT4KewogICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnNpemVfdCBhcml0eSA9IHNpemVvZi4uLihBcmdzKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLAogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWZfdDxmdW5jdGlvbl90cmFpdHM8RnVuYz46OmFyaXR5ID09IDM+KiA9IG51bGxwdHI+CmJvb2wgY2FsbF9yZWFkKEZ1bmMgcmVhZCkKewogICAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLAogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWZfdDxmdW5jdGlvbl90cmFpdHM8RnVuYz46OmFyaXR5ID09IDE+KiA9IG51bGxwdHI+CmJvb2wgY2FsbF9yZWFkKEZ1bmMgcmVhZCkKewogICAgcmV0dXJuIHRydWU7Cn0KCmludCBmb28oaW50IHgsIGludCB5LCBpbnQgeikKewogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkKewogICAgY2FsbF9yZWFkKGZvbyk7CiAgICByZXR1cm4gMDsKfQo=