|
Boost : |
Subject: Re: [boost] Is there interest in typeid(TYPE).name() like function that does not require RTTI
From: Michel Morin (mimomorin_at_[hidden])
Date: 2012-05-30 18:02:19
Antony Polukhin wrote:
>> template <typename T>
>> inline std::string type_name()
>> {
>> #ifndef BOOST_NO_TYPEID
>> return type_name_detail::demangle_impl<T>::apply();
>> #else
>> return BOOST_CURRENT_FUNCTION;
>> #endif
>> }
>
> When RTTI disabled, you are returning whole function name, not just
> the required type T. In your case you`ll get somethihg like
> std::string boost::type_name() [with T = const int&, std::string =
> std::basic_string<char>] instead of 'const int&'.
On VC++ with /GR option, we can still use `typeid` (though we cannot
use it to obtain the dynamic type of polymorphic types).
But, yeah, we get the whole function names if BOOST_CURRENT_FUNCTION is used.
Now I understand what you're trying to do and I'm definitely interested in it!
If there is a reliable way to extract type names from BOOST_CURRENT_FUNCTION,
this is very useful.
Clang-3.1 has gcc-like __PRETTY_FUNCTION__. But, on clang-3.0 and
the prior versions, __PRETTY_FUNCTION__ is less usefull. It does not
contain type names of template arguments for function templates. So
we have to extract type names from function arguments:
template <typename T>
const char * f() { return BOOST_CURRENT_FUNCTION; }
template <typename T>
const char * g(const T&) { return BOOST_CURRENT_FUNCTION; }
f<int>() --> const char *f()
g(0) --> const char *g(const int &)
Thanks for interesting stuff, Antony!
Regards,
Michel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk