簡體   English   中英

std :: tuple_element和參考

[英]std::tuple_element and references

我研究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& (最好使用std11)?

謝謝。

由於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 &
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM