首页 > 解决方案 > 在模板中显示参数类型

问题描述

我正在努力解决参考崩溃问题(https://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996上的第 28 项),并想尝试给不同的东西喂食一个模板。

我用 lvalue 和 ravlue 调用模板,但我没有在模板中看到确切的类型。我怎样才能让编译器在它专门化模板的时候吐出确切的类型?

#include <iostream>
#include <typeinfo>

class Widget{
public:
    int x=0;
};


template<typename T>
void MyMethod(T&& param){
    std::cout << typeid(param).name()<< std::endl; // this just says 6Widget...
};

Widget GetWidget(){
    return Widget();
};

int main() {

    Widget &w1 = * new Widget;
    MyMethod(w1);

    Widget w2;
    MyMethod(w2);

    MyMethod(GetWidget());

    return 0;
}

这只是输出

6Widget
6Widget
6Widget

编译器有没有办法吐出它为调用模板所做的确切专业化和类型?

标签: c++templatesrvaluelvalue

解决方案


真的很棒的书。好像你已经跳过了很多章节。

在第 4 项中,您将看到如何使用 Boost.TypeIndex 做到这一点,其中:

std::cout << boost::typeindex::type_id_with_cvr<decltype(param)>().pretty_name();

推荐阅读