#include <iostream>
using namespace std;
void HelloWorld1(string var1, const char* var2)
{
cout << var1 << " " << var2 << endl;
}
int HelloWorld2(string var1, const char* var2)
{
cout << var1 << " " << var2 << endl;
return 5;
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
fn(forward<Args>(args)...);
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<!is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
return fn(forward<Args>(args)...);
}
int main()
{
CallFunction(HelloWorld1, "Hello", "World 1!");
CallFunction(HelloWorld2, "Hello", "World 2!");
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBIZWxsb1dvcmxkMShzdHJpbmcgdmFyMSwgY29uc3QgY2hhciogdmFyMikKewogICAgY291dCA8PCB2YXIxIDw8ICIgIiA8PCB2YXIyIDw8IGVuZGw7Cn0KCmludCBIZWxsb1dvcmxkMihzdHJpbmcgdmFyMSwgY29uc3QgY2hhciogdmFyMikKewogICAgY291dCA8PCB2YXIxIDw8ICIgIiA8PCB2YXIyIDw8IGVuZGw7CiAgICByZXR1cm4gNTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lLi4uIEFyZ3M+CmF1dG8gQ2FsbEZ1bmN0aW9uKEZuIGZuLCBBcmdzJiYuLi4gYXJncykgLT4gdHlwZW5hbWUgZW5hYmxlX2lmPGlzX3NhbWU8dm9pZCwgZGVjYXlfdDxkZWNsdHlwZShmbihmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk+Pjo6dmFsdWUsIGRlY2x0eXBlKGZuKGZvcndhcmQ8QXJncz4oYXJncykuLi4pKT46OnR5cGUKewogICAgZm4oZm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZS4uLiBBcmdzPgphdXRvIENhbGxGdW5jdGlvbihGbiBmbiwgQXJncyYmLi4uIGFyZ3MpIC0+IHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfc2FtZTx2b2lkLCBkZWNheV90PGRlY2x0eXBlKGZuKGZvcndhcmQ8QXJncz4oYXJncykuLi4pKT4+Ojp2YWx1ZSwgZGVjbHR5cGUoZm4oZm9yd2FyZDxBcmdzPihhcmdzKS4uLikpPjo6dHlwZQp7CiAgICByZXR1cm4gZm4oZm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cn0KCmludCBtYWluKCkKewoJQ2FsbEZ1bmN0aW9uKEhlbGxvV29ybGQxLCAiSGVsbG8iLCAiV29ybGQgMSEiKTsKCUNhbGxGdW5jdGlvbihIZWxsb1dvcmxkMiwgIkhlbGxvIiwgIldvcmxkIDIhIik7CgkKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9