c++ 引用是否有typeid?

4bbkushb  于 2022-11-19  发布在  其他
关注(0)|答案(3)|浏览(136)

我正在寻找一种方法来获得一个类型的名称,类似于typeid,但用于引用。根据this pagetypeid删除引用。
如果type是指涉型别,则结果会指涉指涉的型别。
我正在寻找类似的代码

int x = 5;
int & y = x;
wcout << typeid( y ).name();

但其输出是“int &”而不是“int”。

dw1jzc5e

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;
}
zvokhttg

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

vuv7lop3

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中找到一个工作示例。

  • 注1:显然,如果类型恰好是bool,静态Assert就不会失败。
  • 注2:我知道这个解决方案不打印类型,但它可能在某些情况下是足够的,因为它是为我。

相关问题