#include <iostream>
#include <tuple>
template < typename T> struct FunctionSignatureParser; // Must declare a primary template with a missing implementation
template < typename Result, typename ...Args > struct FunctionSignatureParser< Result( Args...) >
{
using return_type = Result;
using args_tuple = std:: tuple < Args...> ;
template < size_t i> struct arg
{
typedef typename std:: tuple_element < i, args_tuple> :: type type;
} ;
} ;
short square( char x) { // 8-bit integer as input, 16-bit integer as output
return short ( x) * short ( x) ;
}
int main( ) {
char answer = 42 ;
static_assert( std:: is_same < char , FunctionSignatureParser< decltype( square) > :: arg < 0 > :: type > :: value , "Function 'square' does not use an argument of type 'char'" ) ;
static_assert( std:: is_same < short , FunctionSignatureParser< decltype( square) > :: return_type > :: value , "Function 'square' does not return a value of type 'short'" ) ;
short sqrAnswer = square( answer) ;
std:: cout << "The square of " << + answer << " is " << + sqrAnswer << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBGdW5jdGlvblNpZ25hdHVyZVBhcnNlcjsgLy8gTXVzdCBkZWNsYXJlIGEgcHJpbWFyeSB0ZW1wbGF0ZSB3aXRoIGEgbWlzc2luZyBpbXBsZW1lbnRhdGlvbgp0ZW1wbGF0ZTx0eXBlbmFtZSBSZXN1bHQsIHR5cGVuYW1lLi4uQXJncz4gc3RydWN0IEZ1bmN0aW9uU2lnbmF0dXJlUGFyc2VyPFJlc3VsdChBcmdzLi4uKT4KewoJdXNpbmcgcmV0dXJuX3R5cGUgPSBSZXN1bHQ7Cgl1c2luZyBhcmdzX3R1cGxlID0gc3RkOjp0dXBsZTxBcmdzLi4uPjsKCXRlbXBsYXRlIDxzaXplX3QgaT4gc3RydWN0IGFyZwoJewoJCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PGksIGFyZ3NfdHVwbGU+Ojp0eXBlIHR5cGU7Cgl9Owp9OwpzaG9ydCBzcXVhcmUoY2hhciB4KSB7IC8vIDgtYml0IGludGVnZXIgYXMgaW5wdXQsIDE2LWJpdCBpbnRlZ2VyIGFzIG91dHB1dAogICAgcmV0dXJuIHNob3J0KHgpKnNob3J0KHgpOwp9CmludCBtYWluKCkgewogICAgICAgIGNoYXIgYW5zd2VyID0gNDI7CiAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8Y2hhciwgRnVuY3Rpb25TaWduYXR1cmVQYXJzZXI8ZGVjbHR5cGUoc3F1YXJlKT46OmFyZzwwPjo6dHlwZT46OnZhbHVlLCAiRnVuY3Rpb24gJ3NxdWFyZScgZG9lcyBub3QgdXNlIGFuIGFyZ3VtZW50IG9mIHR5cGUgJ2NoYXInIik7CiAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c2hvcnQsIEZ1bmN0aW9uU2lnbmF0dXJlUGFyc2VyPGRlY2x0eXBlKHNxdWFyZSk+OjpyZXR1cm5fdHlwZT46OnZhbHVlLCAiRnVuY3Rpb24gJ3NxdWFyZScgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSAnc2hvcnQnIik7CiAgICAgICAgc2hvcnQgc3FyQW5zd2VyID0gc3F1YXJlKGFuc3dlcik7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJUaGUgc3F1YXJlIG9mICIgPDwgK2Fuc3dlciA8PCAiIGlzICIgPDwgK3NxckFuc3dlciA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDA7Cn0=