模板参数通用引用的typeid

时间:2013-05-25 10:16:36

标签: c++ c++11

如果模板参数是右值引用,引用或常量值,是否可以输出某些方法?也就是说,我正在使用通用引用,并且为了调试/学习目的,想要确切地看到实际匹配的类型。

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

这当然没有告诉我它是传递的rvalue,lvalue或const参数。我想以某种方式显示实际匹配的参数类型。请注意,我特别感兴趣的是看看这个单一功能是如何匹配的。

1 个答案:

答案 0 :(得分:3)

您可能需要查看type_traits标题。它具有检测类型是否为const以及是否为reference的特征。 您可以查看T以查看您绑定的引用类型:

  1. 如果f属于laval-reference-type,那么T
  2. 如果fconst,那么T
  3. 如果f是rvalue-reference,那么T不是引用(如果至少受到参数推断的约束)。
  4. 所以你可以这样做:

    template<typename T>
    void write( T && f ) {
        std::cout << "f is a " <<(std::is_const<typename std::remove_reference<T>::type>::value?"const ":"")<<(std::is_lvalue_reference<T>::value?"lvalue":"rvalue")<<" reference";
    }