#include <iostream>
#include <vector>
#include <algorithm> // std::remove_if
using namespace std;
template <typename T>
class check {
public:
virtual bool operator()(T x) = 0;
};
template <typename T>
struct cheat {
cheat(check<T> *c) {_c = c;}
bool operator()(T x) {return _c->operator ()(x);}
check<T> *_c;
};
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(), cheat<int>(&e)); // no error
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPiAgICAvLyBzdGQ6OnJlbW92ZV9pZgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIGNoZWNrIHsKCXB1YmxpYzoKCXZpcnR1YWwgYm9vbCBvcGVyYXRvcigpKFQgeCkgPSAwOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBjaGVhdCB7CgljaGVhdChjaGVjazxUPiAqYykJIHtfYyA9IGM7fQoJYm9vbCBvcGVyYXRvcigpKFQgeCkge3JldHVybiBfYy0+b3BlcmF0b3IgKCkoeCk7fQoJY2hlY2s8VD4gKl9jOwp9OwoKaW50IG1haW4oKSB7CgkKCWludCBhcnJheVtdID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCB9OwogICBzdGQ6OnZlY3RvcjxpbnQ+IHYoIGFycmF5LCBhcnJheSsxMCApOwoKICAgY2xhc3MgZXZlbiA6IHB1YmxpYyBjaGVjazxpbnQ+CiAgIHsKICAgCXB1YmxpYzoKICAgIAl2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSggaW50IHggKSB7IGNvdXQ8PCJIaSI8PGVuZGw7IHJldHVybiAhKCB4ICUgMiApOyB9CiAgIH07CiAgIGV2ZW4gZTsKCiAgIHJlbW92ZV9pZiggdi5iZWdpbigpLCB2LmVuZCgpLCAgY2hlYXQ8aW50PigmZSkpOyAvLyBubyBlcnJvcgoJCiAgIHJldHVybiAwOwp9