gpt4 book ai didi

c++ - 从 type_id_with_cv<>()::pretty_name() 移除命名空间

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:31 25 4
gpt4 key购买 nike

我正在使用以下代码来检索类的名称:

template <typename T>
string GetName(const T& object) {

using type = typename remove_const<typename remove_reference<decltype(object)>::type>::type;
return boost::typeindex::type_id_with_cvr<type>().pretty_name();

}

代码运行良好。但是,返回的字符串还包含 namespace 。有没有只返回类名的boost函数?我知道我可以自己写,重点是不要重新发明轮子。

最佳答案

这是轮子的另一项发明和可怕但快速的解决方案,基本上,利用命名空间结构和目录结构之间的相似性。

#include<boost/type_index.hpp>
#include<boost/filesystem/path.hpp>

namespace A{
namespace B{
struct C{};
}
}


int main(){
std::string s = boost::typeindex::type_id_with_cvr<A::B::C const*&>().pretty_name();
replace(begin(s), end(s), ':', '/');
replace(begin(s), end(s), ' ', '.');

using namespace boost::filesystem;
assert( path(s).string() == "A//B//C.const*&" );
assert( path(s).filename() == "C.const*&" );
assert( path(s).extension() == ".const*&" );
assert( path(s).stem() == "C" );
assert( path(s).parent_path() == "A//B");
assert( path(s).parent_path().parent_path() == "A");
}

或者把它打包成一个简单丑陋的类:

#include<boost/type_index.hpp>
#include<boost/filesystem/path.hpp>

namespace A{
namespace B{
struct C{};
}
}

template<class T>
class typename_info_t{
boost::filesystem::path p_;
public:
typename_info_t(){
std::string s = boost::typeindex::type_id_with_cvr<T>().pretty_name();
replace(begin(s), end(s), ':', '/');
replace(begin(s), end(s), ' ', '.');
p_ = s;
}
std::string full_name() const{
std::string s = p_.string();
replace(begin(s), end(s), '/', ':');
replace(begin(s), end(s), '.', ' ');
return s;
}
std::string namespace_name() const{
std::string s = p_.parent_path().string();
replace(begin(s), end(s), '/', ':');
return s;
}
std::string class_name() const{
std::string s = p_.stem().string();
replace(begin(s), end(s), '/', ':');
return s;
}
std::string class_name_with_cvr() const{
std::string s = p_.filename().string();
replace(begin(s), end(s), '/', ':');
replace(begin(s), end(s), '.', ' ');
return s;
}
std::string cvr() const{ // begins with space
std::string s = p_.extension().string();
replace(begin(s), end(s), '.', ' ');
return s;
}
};

template<class TT> typename_info_t<TT> typename_info(){return {};}


int main(){
assert( typename_info<A::B::C const*&>().full_name() == "A::B::C const*&" );
assert( typename_info<A::B::C const*&>().namespace_name() == "A::B" );
assert( typename_info<A::B::C const*&>().class_name() == "C" );
assert( typename_info<A::B::C const*&>().class_name_with_cvr() == "C const*&" );
assert( typename_info<A::B::C const*&>().cvr() == " const*&");

}

(限制:'*' 指针限定符不是此处类名的一部分,不幸的是,这强制使用 #include<boost/filesystem.hpp>#include<experimental/filesystem>,它们是非头文件库。

关于c++ - 从 type_id_with_cv<>()::pretty_name() 移除命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36009223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com