Другие ответы в основном верны, что вы не можете сделать это. aix намекает на решение пользовательского типа возврата с перегруженными операторами преобразования, но справедливо указывает, что это не вменяемая вещь. Я шел по этому пути довольно часто и, в конечном счете, неявные преобразования, последовательности преобразований и неоднозначности будут кусать вас сзади.
Мне это часто было нужно. В конечном итоге я в конечном итоге собираюсь использовать ряд перегруженных функций или шаблонов, в зависимости от ваших потребностей, например, так:
void lookup( int& v, char const * name );
void lookup( double& c, char const * name );
В случае шаблона я создал глобальные конвертеры и выполнил следующую функцию-член:
template<T>
void lookup( T&v, char const* name ) { v = convert<T>( get(name) ); }
Если вы хотите сохранить возвращаемое значение в качестве поиска, вам придется явно вызывать шаблонную функцию.
template<T> T get( char const * name ) { ... }
//use
int a = obj.get<int>( "name" );
double b = obj.get<double>( "floaty" );