Force Boost TypeIndex报告特定的pretty_name

alf*_*lfC 9 boost typeid

我想指定Boost TypeIndex报告的某种类型boost::typeindex::type_id<T>().pretty_name()会产生一个特定的名称.

我想要解决的问题是,正如其他地方所报告的那样,有一个特殊情况令人困惑,即std::string报告的类型(或别名)std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >.

(我理解这个的原因,std::string是别名.我只想在这种特殊情况下覆盖报告的字符串.)

我按照http://www.boost.org/doc/libs/1_59_0/doc/html/boost_typeindex/making_a_custom_type_index.html中的说明进行操作,自定义代码的开头如下所示:

namespace my_namespace { namespace detail {
    template <class T> struct typenum;
    template <> struct typenum<void>{       enum {value = 0}; };
    template <> struct typenum<std::string>{       enum {value = 1}; };

    struct my_typeinfo {const char* const type_;};

    const my_typeinfo infos[2] = {
        {"void"}, {"std::string"}
    };
    ...
    ... 
Run Code Online (Sandbox Code Playgroud)

但最后,我能做的最多就是用另一种方式替换一种类型的报告,而不仅仅是修改一种情况.

一个轻量级的解决方案可能是专门化boost::typeindex::stl_type_index(输出类型type_id<std::string>()),但到那时,类的实际静态信息将丢失.(没有专门的课程.)

但如果没有完全专业化typeid<std::string>似乎很难做到这一点就无法做到.

这有解决方法吗?我更喜欢Boost.Typeindex中的解决方案,而不是运行时字符串替换.


这是我发现的一种非常脏的方式,但它并不完美,可以在未来产生其他问题.

struct std_string{}; // dummy replacement class name

namespace boost{
namespace typeindex{
    template<> boost::typeindex::stl_type_index type_id<std::string>() noexcept{
        return type_id<std_string>(); // will report "std_string", ugly, but better than `std::__cxx11::basic_string<...>`
    }
}}
Run Code Online (Sandbox Code Playgroud)

alf*_*lfC 0

这是我发现的一种非常肮脏的方式,但它并不完美,并且可能会在以后产生其他问题。

struct std_string{}; // dummy replacement class name

namespace boost{
namespace typeindex{
    template<> boost::typeindex::stl_type_index type_id<std::string>() noexcept{
        return type_id<std_string>(); // will report "std_string", ugly, but better than `std::__cxx11::basic_string<...>`
    }
}}
Run Code Online (Sandbox Code Playgroud)