Skip to content

Latest commit

 

History

History
58 lines (44 loc) · 1.18 KB

File metadata and controls

58 lines (44 loc) · 1.18 KB

条款04:掌握查看类型推导结果的方法

使用 typeid 可以运行时输出类型信息:

template <typename T>
void f(const T& param) {
    std::cout << typeid(T).name() << std::endl;
    std::cout << typeid(param).name() << std::endl;
}

对于如下调用:

std::vector<Widget> createVec();
const auto vw = createVec();
if (&vw[0]) {
    f(&vw[0]);
    ...
}

MSVC的输出结果:

class Widget const *
class Widget const *

然而,param应当是 const Widget * const & 类型,而这里和 T 类型相同。原因是 std::type_info::name 类型处理方式就像使用模板按值传递形参,会去掉引用和cv修饰。

使用Boost.TypeIndex可以产生精确的类型信息:

#include <boost/type_index.hpp>

template <typename T>
void f(const T& param) {
    using std::cout;
    using boost::typeindex::type_id_with_cvr;

    cout << "T = "
         << type_id_with_cvr<T>().pretty_name()
         << '\n';

    cout << "param = "
         << type_id_with_cvr<decltype(param)>().pretty_name()
         << '\n';
}

MSVC编译器的结果如下:

T =     class Widget const*
param = class Widget const* const&