std :: tuple_element和引用

时间:2016-05-05 22:43:13

标签: c++ c++11 stdtuple

我研究std :: tuple。

我们有:

struct test_struct{};

我写

std::cout << typeid(std::tuple_element_t<0, std::tuple<struct test_struct &>>).name();

我期待的是

类型
struct test_struct &

但我收到了:

struct test_struct

如何提取类型 struct test_struct&amp; (最好使用std11)?

感谢。

1 个答案:

答案 0 :(得分:0)

由于typeid运算符无法使用作为参考类型,

  

§5.2.8/ 4-5
  如果 type 是引用类型,则结果引用表示引用类型的std::type_info对象。

     

在所有情况下,typeid都会忽略cv限定符(即typeid(T)==typeid(const T)

您可以编写几个包装器来查找带有cv限定符的引用类型或类型的名称。

template<typename T>
struct typeid_hlp
{
    static std::string name() { return typeid(T).name(); }
};

template<typename T>
struct typeid_hlp<T&>
{
    static std::string name() { return typeid_hlp<T>::name() + std::string(" &"); }
};

template<typename T>
struct typeid_hlp<T&&>
{
    static std::string name() { return typeid_hlp<T>::name() + std::string(" &&"); }
};

template<typename T>
struct typeid_hlp<const T>
{
    static std::string name() { return std::string("const ") + typeid_hlp<T>::name(); }
};

template<typename T>
struct typeid_hlp<volatile T>
{
    static std::string name() { return std::string("volatile ") + typeid_hlp<T>::name(); }
};

并像

一样使用它
int main()
{
    std::cout << typeid_hlp<int>::name() << std::endl; // int
    std::cout << typeid_hlp<int&>::name() << std::endl; // int &
    std::cout << typeid_hlp<const int>::name() << std::endl; // const int
    std::cout << typeid_hlp<volatile const int * const &>::name() << std::endl; // const int const volatile * __ptr64 &
}