#include <iostream>
#include <type_traits>
struct Test
{
void f();
template<typename T>
using verify = typename std::enable_if<std::is_same<T, T>::value, T>::type;
template<typename T, typename R, typename... Args>
using MFP = R (verify<T>::*)(Args...);
template<typename T, typename R, typename... Args>
static MFP<T, R, Args...> g(MFP<T, R, Args...> mf){return mf;}
};
int main()
{
auto test = Test::g(&Test::f);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgVGVzdAp7Cgl2b2lkIGYoKTsKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cgl1c2luZyB2ZXJpZnkgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgVD46OnZhbHVlLCBUPjo6dHlwZTsKCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+Cgl1c2luZyBNRlAgPSBSICh2ZXJpZnk8VD46OiopKEFyZ3MuLi4pOwoJdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4KCXN0YXRpYyBNRlA8VCwgUiwgQXJncy4uLj4gZyhNRlA8VCwgUiwgQXJncy4uLj4gbWYpe3JldHVybiBtZjt9Cn07CgppbnQgbWFpbigpCnsKCWF1dG8gdGVzdCA9IFRlc3Q6OmcoJlRlc3Q6OmYpOwp9Cg==
prog.cpp: In function ‘int main()’:
prog.cpp:17:30: error: no matching function for call to ‘Test::g(void (Test::*)())’
auto test = Test::g(&Test::f);
^
prog.cpp:17:30: note: candidate is:
prog.cpp:12:28: note: template<class T, class R, class ... Args> static R (std::enable_if<std::is_same<_Tp, _Tp>::value, T>::type::* Test::g(Test::MFP<T, R, Args ...>))(Args ...)
static MFP<T, R, Args...> g(MFP<T, R, Args...> mf){return mf;}
^
prog.cpp:12:28: note: template argument deduction/substitution failed:
prog.cpp:17:30: note: couldn't deduce template parameter ‘T’
auto test = Test::g(&Test::f);
^