使用 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&