- #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