#include <iostream>
using namespace std;
class FeaturesExample {};
class Example : public FeaturesExample {};
class Base {
public:
float getFloat(const FeaturesExample& ex) const {
return (this->*getFloatImplPtr_)(ex);
}
float (Base::*getFloatImplPtr_)(const FeaturesExample& ex) const;
float getFloatImpl_(const FeaturesExample& ex) const {
return 0.0;
}
};
class Derived : public Base {
public:
float getFloatImpl(const Example& ex) {
return 1.0;
}
};
int main() {
FeaturesExample ex;
Derived derived;
derived.getFloatImplPtr_ = (decltype(derived.getFloatImplPtr_))(&Derived::getFloatImpl);
derived.getFloat();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgRmVhdHVyZXNFeGFtcGxlIHt9OwpjbGFzcyBFeGFtcGxlIDogcHVibGljIEZlYXR1cmVzRXhhbXBsZSB7fTsKCmNsYXNzIEJhc2UgewogcHVibGljOgogIGZsb2F0IGdldEZsb2F0KGNvbnN0IEZlYXR1cmVzRXhhbXBsZSYgZXgpIGNvbnN0IHsKICAJcmV0dXJuICh0aGlzLT4qZ2V0RmxvYXRJbXBsUHRyXykoZXgpOwogIH0KICBmbG9hdCAoQmFzZTo6KmdldEZsb2F0SW1wbFB0cl8pKGNvbnN0IEZlYXR1cmVzRXhhbXBsZSYgZXgpIGNvbnN0OwogIGZsb2F0IGdldEZsb2F0SW1wbF8oY29uc3QgRmVhdHVyZXNFeGFtcGxlJiBleCkgY29uc3QgewogIAlyZXR1cm4gMC4wOwogIH0KfTsKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKIHB1YmxpYzoKICBmbG9hdCBnZXRGbG9hdEltcGwoY29uc3QgRXhhbXBsZSYgZXgpIHsKICAJcmV0dXJuIDEuMDsKICB9Cn07CmludCBtYWluKCkgewoJRmVhdHVyZXNFeGFtcGxlIGV4OwoJRGVyaXZlZCBkZXJpdmVkOwoJZGVyaXZlZC5nZXRGbG9hdEltcGxQdHJfID0gKGRlY2x0eXBlKGRlcml2ZWQuZ2V0RmxvYXRJbXBsUHRyXykpKCZEZXJpdmVkOjpnZXRGbG9hdEltcGwpOwoJZGVyaXZlZC5nZXRGbG9hdCgpOwoJcmV0dXJuIDA7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:27:19: error: no matching function for call to ‘Derived::getFloat()’
derived.getFloat();
^
prog.cpp:9:9: note: candidate: float Base::getFloat(const FeaturesExample&) const
float getFloat(const FeaturesExample& ex) const {
^~~~~~~~
prog.cpp:9:9: note: candidate expects 1 argument, 0 provided