#include <iostream>
struct Var {
char getChar() const { return 0; }
int getInt() const { return 1; }
float getFloat() const { return 1.1f; }
double getDouble() const { return 1.11; }
};
class Base {
public:
virtual void set(const Var &x) {};
};
class SetImpl {
protected:
void set_impl(const Var &x, char &y) {
y = x.getChar();
}
void set_impl(const Var &x, int &y) {
y = x.getInt();
}
void set_impl(const Var &x, float &y) {
y = x.getFloat();
}
void set_impl(const Var &x, double &y) {
y = x.getDouble();
}
};
template <typename T>
class Deriv : public Base, public SetImpl {
T &v;
public:
Deriv(T &v) : v(v) {}
virtual void set(const Var &x) {
set_impl(x, v);
};
};
#include <vector>
#include <memory>
using namespace std;
int main(int argc, char *argv[]) {
Var v;
char c;
int n;
float f;
double d;
vector<Base *> xs;
xs.push_back(new Deriv<decltype(c)>(c));
xs.push_back(new Deriv<decltype(n)>(n));
xs.push_back(new Deriv<decltype(f)>(f));
xs.push_back(new Deriv<decltype(d)>(d));
for(auto x : xs) {
x->set(v);
}
cout << (int)c << ", " << n << ", " << f << ", " << d << endl;
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFZhciB7CgljaGFyIGdldENoYXIoKSBjb25zdCB7IHJldHVybiAwOyB9CglpbnQgZ2V0SW50KCkgY29uc3QgeyByZXR1cm4gMTsgfQoJZmxvYXQgZ2V0RmxvYXQoKSBjb25zdCB7IHJldHVybiAxLjFmOyB9Cglkb3VibGUgZ2V0RG91YmxlKCkgY29uc3QgeyByZXR1cm4gMS4xMTsgfQp9OwoKY2xhc3MgQmFzZSB7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCBzZXQoY29uc3QgVmFyICZ4KSB7fTsKfTsKCmNsYXNzIFNldEltcGwgewpwcm90ZWN0ZWQ6Cgl2b2lkIHNldF9pbXBsKGNvbnN0IFZhciAmeCwgY2hhciAmeSkgewoJCXkgPSB4LmdldENoYXIoKTsKCX0KCXZvaWQgc2V0X2ltcGwoY29uc3QgVmFyICZ4LCBpbnQgJnkpIHsKCQl5ID0geC5nZXRJbnQoKTsKCX0KCXZvaWQgc2V0X2ltcGwoY29uc3QgVmFyICZ4LCBmbG9hdCAmeSkgewoJCXkgPSB4LmdldEZsb2F0KCk7Cgl9Cgl2b2lkIHNldF9pbXBsKGNvbnN0IFZhciAmeCwgZG91YmxlICZ5KSB7CgkJeSA9IHguZ2V0RG91YmxlKCk7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgRGVyaXYgOiBwdWJsaWMgQmFzZSwgcHVibGljIFNldEltcGwgewoJVCAmdjsKcHVibGljOgoJRGVyaXYoVCAmdikgOiB2KHYpIHt9Cgl2aXJ0dWFsIHZvaWQgc2V0KGNvbnN0IFZhciAmeCkgewoJCXNldF9pbXBsKHgsIHYpOwoJfTsKfTsKCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtZW1vcnk+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CglWYXIgdjsKCWNoYXIgYzsKCWludCBuOwoJZmxvYXQgZjsKCWRvdWJsZSBkOwoJCgl2ZWN0b3I8QmFzZSAqPiB4czsKCXhzLnB1c2hfYmFjayhuZXcgRGVyaXY8ZGVjbHR5cGUoYyk+KGMpKTsKCXhzLnB1c2hfYmFjayhuZXcgRGVyaXY8ZGVjbHR5cGUobik+KG4pKTsKCXhzLnB1c2hfYmFjayhuZXcgRGVyaXY8ZGVjbHR5cGUoZik+KGYpKTsKCXhzLnB1c2hfYmFjayhuZXcgRGVyaXY8ZGVjbHR5cGUoZCk+KGQpKTsKCQoJZm9yKGF1dG8geCA6IHhzKSB7CgkJeC0+c2V0KHYpOwoJfQoJCgljb3V0IDw8IChpbnQpYyA8PCAiLCAiIDw8IG4gPDwgIiwgIiA8PCBmIDw8ICIsICIgPDwgZCA8PCBlbmRsOwoJCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9