#include <iostream>
template <typename R, typename... Tn>
class func
{
R (*fptr)(Tn...); // C2091
public:
func() : fptr(nullptr) {}
func( R (*f) (Tn...) ) : fptr(f) {} // C2091
R operator()(Tn... args)
{ // C2091
return fptr(args...);
}
func& operator=( R (*f) (Tn...) ) // C2091
{
fptr = f;
return *this;
}
};
int foo(int a, int b)
{
std::cout << "foo\n";
return 0;
}
int main()
{
func<int, int, int> myfunc;
myfunc = foo; // C2679: binary '=' : no operator found which takes
// a right-hand operand of type 'int (__cdecl *)(int,int)' (or
// there is no acceptable conversion)
return myfunc(1, 2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBUbj4KY2xhc3MgZnVuYwp7CiAgICBSICgqZnB0cikoVG4uLi4pOyAvLyBDMjA5MQpwdWJsaWM6CiAgICBmdW5jKCkgOiBmcHRyKG51bGxwdHIpIHt9CiAgICBmdW5jKCBSICgqZikgKFRuLi4uKSApIDogZnB0cihmKSB7fSAvLyBDMjA5MQogICAgUiBvcGVyYXRvcigpKFRuLi4uIGFyZ3MpCiAgICB7IC8vIEMyMDkxCiAgICAgICAgcmV0dXJuIGZwdHIoYXJncy4uLik7CiAgICB9CiAgICBmdW5jJiBvcGVyYXRvcj0oIFIgKCpmKSAoVG4uLi4pICkgLy8gQzIwOTEKICAgIHsKICAgICAgICBmcHRyID0gZjsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cn07CiAKaW50IGZvbyhpbnQgYSwgaW50IGIpCnsKICAgIHN0ZDo6Y291dCA8PCAiZm9vXG4iOwogICAgcmV0dXJuIDA7Cn0KIAppbnQgbWFpbigpCnsKICAgIGZ1bmM8aW50LCBpbnQsIGludD4gbXlmdW5jOwogICAgbXlmdW5jID0gZm9vOyAvLyBDMjY3OTogYmluYXJ5ICc9JyA6IG5vIG9wZXJhdG9yIGZvdW5kIHdoaWNoIHRha2VzCiAgICAvLyBhIHJpZ2h0LWhhbmQgb3BlcmFuZCBvZiB0eXBlICdpbnQgKF9fY2RlY2wgKikoaW50LGludCknIChvciAKICAgIC8vIHRoZXJlIGlzIG5vIGFjY2VwdGFibGUgY29udmVyc2lvbikKICAgIHJldHVybiBteWZ1bmMoMSwgMik7Cn0=