#include <iostream>
#include <string>
template<typename... Ts>
struct Executor { };
template<typename ReturnType, typename... Params>
struct Executor<ReturnType (*)(Params...)> {
private:
// using M = ReturnType (*)(Params...);
typedef ReturnType (*M)(Params...);
public:
bool operator()(M method, Params... params) {
ReturnType r = method(params...);
return (r ? true : false);
}
template<typename... InvalidParams>
bool operator()(M method, InvalidParams... ts) {
return false;
}
};
#define ExecuteMethod(M, ...) Executor<decltype(&M)>{}(M, ##__VA_ARGS__)
bool func(int i, int j, std::string& k) {
k = "ho ho";
return true;
}
int main() {
int i = 3;
int j = 4;
std::string s = "yo";
std::cout << s << std::endl;
bool a = ExecuteMethod(func, i, j, s);
bool b = ExecuteMethod(func, 3, 4, "yo");
bool c = ExecuteMethod(func, "yo", 3, 4);
std::cout << std::boolalpha << a << std::endl;
std::cout << std::boolalpha << b << std::endl;
std::cout << std::boolalpha << c << std::endl;
std::cout << s << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBFeGVjdXRvciB7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBSZXR1cm5UeXBlLCB0eXBlbmFtZS4uLiBQYXJhbXM+CnN0cnVjdCBFeGVjdXRvcjxSZXR1cm5UeXBlICgqKShQYXJhbXMuLi4pPiB7CiAgICBwcml2YXRlOgovLyAgICAgICAgdXNpbmcgTSA9IFJldHVyblR5cGUgKCopKFBhcmFtcy4uLik7CiAgICAgICAgdHlwZWRlZiBSZXR1cm5UeXBlICgqTSkoUGFyYW1zLi4uKTsKICAgIHB1YmxpYzoKICAgICAgICBib29sIG9wZXJhdG9yKCkoTSBtZXRob2QsIFBhcmFtcy4uLiBwYXJhbXMpIHsKICAgICAgICAgICAgUmV0dXJuVHlwZSByID0gbWV0aG9kKHBhcmFtcy4uLik7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gKHIgPyB0cnVlIDogZmFsc2UpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBJbnZhbGlkUGFyYW1zPgogICAgICAgIGJvb2wgb3BlcmF0b3IoKShNIG1ldGhvZCwgSW52YWxpZFBhcmFtcy4uLiB0cykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQp9OwoKI2RlZmluZSBFeGVjdXRlTWV0aG9kKE0sIC4uLikgRXhlY3V0b3I8ZGVjbHR5cGUoJk0pPnt9KE0sICMjX19WQV9BUkdTX18pCgoKCmJvb2wgZnVuYyhpbnQgaSwgaW50IGosIHN0ZDo6c3RyaW5nJiBrKSB7CiAgICBrID0gImhvIGhvIjsKICAgIHJldHVybiB0cnVlOwp9CgppbnQgbWFpbigpIHsKICAgIGludCBpID0gMzsKICAgIGludCBqID0gNDsKICAgIHN0ZDo6c3RyaW5nIHMgPSAieW8iOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7CiAgICAKICAgIGJvb2wgYSA9IEV4ZWN1dGVNZXRob2QoZnVuYywgaSwgaiwgcyk7CiAgICBib29sIGIgPSBFeGVjdXRlTWV0aG9kKGZ1bmMsIDMsIDQsICJ5byIpOwogICAgYm9vbCBjID0gRXhlY3V0ZU1ldGhvZChmdW5jLCAieW8iLCAzLCA0KTsKICAgIAogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGEgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGIgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGMgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHMgPDwgc3RkOjplbmRsOwp9