我正在寻找一种方法来获得一个类型的名称,类似于typeid,但用于引用。根据this page,typeid删除引用。如果type是指涉型别,则结果会指涉指涉的型别。我正在寻找类似的代码
typeid
int x = 5; int & y = x; wcout << typeid( y ).name();
但其输出是“int &”而不是“int”。
dw1jzc5e1#
请参阅this answer以了解C++11的实现方法--它涉及到使用type_traits。
#include <type_traits> #include <typeinfo> #ifndef _MSC_VER # include <cxxabi.h> #endif #include <memory> #include <string> #include <cstdlib> template <class T> std::string type_name() { typedef typename std::remove_reference<T>::type TR; std::unique_ptr<char, void(*)(void*)> own ( #ifndef _MSC_VER abi::__cxa_demangle(typeid(TR).name(), nullptr, nullptr, nullptr), #else nullptr, #endif std::free ); std::string r = own != nullptr ? own.get() : typeid(TR).name(); if (std::is_const<TR>::value) r += " const"; if (std::is_volatile<TR>::value) r += " volatile"; if (std::is_lvalue_reference<T>::value) r += "&"; else if (std::is_rvalue_reference<T>::value) r += "&&"; return r; }
zvokhttg2#
据我所知,实现此目的的唯一可移植方法是使用Boost.TypeIndex
std::cout << boost::typeindex::type_id_with_cvr<decltype(x)>().pretty_name() << '\n'; std::cout << boost::typeindex::type_id_with_cvr<decltype(y)>().pretty_name() << '\n';
打印
int int&
Live demo
vuv7lop33#
我发现下面的解决方案非常有用。我让编译器失败,并显示一条错误消息,告诉我实际的类型。使用楼主的用例:
#include <type_traits> int x = 5; int & y = x; static_assert(std::is_same<decltype(y), bool>::value, "");
clang(从版本8.0.0开始)输出以下内容:
error: static_assert failed due to requirement 'std::is_same<int &, bool>::value'
您可以在Compiler Explorer中找到一个工作示例。
bool
3条答案
按热度按时间dw1jzc5e1#
请参阅this answer以了解C++11的实现方法--它涉及到使用type_traits。
zvokhttg2#
据我所知,实现此目的的唯一可移植方法是使用Boost.TypeIndex
打印
Live demo
vuv7lop33#
我发现下面的解决方案非常有用。我让编译器失败,并显示一条错误消息,告诉我实际的类型。使用楼主的用例:
clang(从版本8.0.0开始)输出以下内容:
您可以在Compiler Explorer中找到一个工作示例。
bool
,静态Assert就不会失败。