#include <iostream>
#include <string>
class Foo {
//...
public:
static Foo & getInstance() {
static Foo instance;
return instance;
}
template <typename V, typename ...X>
void DoJob (V verify, X... x) {
verify(x...);
}
};
struct Vvoid {
void operator () (void) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
};
struct Vstring {
void operator () (std::string msg) {
std::cout << __PRETTY_FUNCTION__ << ':' << msg << '\n';
}
};
void Vfunction (void) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
int main() {
Foo &f = Foo::getInstance();
f.DoJob(Vvoid());
f.DoJob(Vstring(), "msg");
f.DoJob(Vfunction);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgRm9vIHsKICAgIC8vLi4uIApwdWJsaWM6CiAgICBzdGF0aWMgRm9vICYgZ2V0SW5zdGFuY2UoKSB7CiAgICAgICAgc3RhdGljIEZvbyBpbnN0YW5jZTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgViwgdHlwZW5hbWUgLi4uWD4KICAgIHZvaWQgRG9Kb2IgKFYgdmVyaWZ5LCBYLi4uIHgpIHsKICAgICAgICB2ZXJpZnkoeC4uLik7CiAgICB9IAp9OwoKc3RydWN0IFZ2b2lkIHsKICAgIHZvaWQgb3BlcmF0b3IgKCkgKHZvaWQpIHsgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsgfQp9OwoKc3RydWN0IFZzdHJpbmcgewogICAgdm9pZCBvcGVyYXRvciAoKSAoc3RkOjpzdHJpbmcgbXNnKSB7CiAgICAJc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJzonIDw8IG1zZyA8PCAnXG4nOwogICAgfQp9OwoKdm9pZCBWZnVuY3Rpb24gKHZvaWQpIHsgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsgfQoKaW50IG1haW4oKSB7CiAgICBGb28gJmYgPSBGb286OmdldEluc3RhbmNlKCk7CiAgICBmLkRvSm9iKFZ2b2lkKCkpOwogICAgZi5Eb0pvYihWc3RyaW5nKCksICJtc2ciKTsKICAgIGYuRG9Kb2IoVmZ1bmN0aW9uKTsKICAgIHJldHVybiAwOwp9