#include <iostream>
#include <vector>
#include <algorithm> // std::remove_if
using namespace std;
template <typename T>
class check {
public:
virtual bool operator()(T x) = 0;
struct aid{
aid(check *p){ _c = p;}
check *_c;
bool operator()(T x){
return _c->operator ()(x);
}
};
aid retMe(){
return aid(this);
}
};
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> v( array, array+10 );
class even : public check<int>
{
public:
virtual bool operator()( int x ) { cout<<"Hi"<<endl; return !( x % 2 ); }
};
even e;
remove_if( v.begin(), v.end(), e.retMe()); // no error
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPiAgICAvLyBzdGQ6OnJlbW92ZV9pZgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIGNoZWNrIHsKCXB1YmxpYzoKCXZpcnR1YWwgYm9vbCBvcGVyYXRvcigpKFQgeCkgPSAwOwoJCglzdHJ1Y3QgYWlkewoJCWFpZChjaGVjayAqcCl7IF9jID0gcDt9CgkJY2hlY2sgKl9jOwoJCWJvb2wgb3BlcmF0b3IoKShUIHgpewoJCQlyZXR1cm4gX2MtPm9wZXJhdG9yICgpKHgpOwoJCX0KCX07CgkKCWFpZCByZXRNZSgpewoJCXJldHVybiBhaWQodGhpcyk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCQoJaW50IGFycmF5W10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwIH07CiAgIHN0ZDo6dmVjdG9yPGludD4gdiggYXJyYXksIGFycmF5KzEwICk7CgogICBjbGFzcyBldmVuIDogcHVibGljIGNoZWNrPGludD4KICAgewogICAJcHVibGljOgogICAgCXZpcnR1YWwgYm9vbCBvcGVyYXRvcigpKCBpbnQgeCApIHsgY291dDw8IkhpIjw8ZW5kbDsgcmV0dXJuICEoIHggJSAyICk7IH0KICAgfTsKICAgZXZlbiBlOwoKICAgcmVtb3ZlX2lmKCB2LmJlZ2luKCksIHYuZW5kKCksIGUucmV0TWUoKSk7IC8vIG5vIGVycm9yCgkKICAgcmV0dXJuIDA7Cn0=