我想指定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)
这是我发现的一种非常肮脏的方式,但它并不完美,并且可能会在以后产生其他问题。
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)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |