#include <iostream>
#include <functional>
#include <memory>

template <typename T, typename V>
int mao(T&& t, V&& v, decltype( (t.*v)(0), (int)0 ))
{//オブジェクトとメンバーポインタの組み合わせ
	return 0;
}
template <typename T, typename V>
int mao(T&& t, V&& v, decltype( (*t.*v)(0), (char)0) )
{//ポインタ（生ポ／スマポ）とメンバーポインタの組み合わせ
	return 1;
}
template <typename T, typename V>
int mao(T&& t, V&& v, ...)
{//それ以外
	return -1;
}

struct test	{
	int a;
	test(int b) : a(b) { }
	int get(int b) const { return a+b; }
};

int  main()
{
	test a(7);
	std::unique_ptr<test> p(new test(8));
	std::cout << mao(a, &test::get,0) << std::endl;
	std::cout << mao(&a, &test::get,0) << std::endl;
	std::cout << mao(p, &test::get,0) << std::endl;
	return 0;
}