2016-05-05 7 views
0

Ich studiere std :: tuple.std :: tuple_element und referenzen

Lasst uns haben wir:

struct test_struct{}; 

I

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

schreiben, und ich hatte erwartet, den Typ

struct test_struct & 

Aber ich erhielt:

struct test_struct 

Wie kann ich extrahieren struct test_struct & (vorzugsweise mit std11)?

Danke.

+3

'typeid' Referenzen Streifen, das heißt' typeid (int &) == typeid (int) '. Die wirkliche Frage ist: * Warum willst du das *? Wenn Sie das liefern (also MVCE), könnten wir diagnostizieren, warum es sich nicht wie erwartet verhält. Aber jetzt scheint alles wie erwartet zu sein. – GManNickG

Antwort

0

Da typeid Operator nicht Arbeit für Referenztypen

§5.2.8/4-5
Wenn Typ ein Referenztyp ist, bezieht sich das Ergebnis auf ein Objekt der std::type_info repräsentiere referenzierter Typ

In allen Fällen werden cv-Qualifier von typeid ignoriert (dh, typeid(T)==typeid(const T))

Sie einige Wrapper schreiben können Namen von Referenztypen oder Typen mit cv-Qualifier zu erfahren.

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(); } 
}; 

Und verwenden Sie es wie

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 & 
} 
+0

Danke. Ich verstehe richtig, dass ich von tuple_element_t bekomme ich richtigen Referenztyp, sein einziges Ausgabeproblem, dass ich keinen Bezug sehe? –

+0

@JDiOrEximen Ja, 'typeid' stripet const-Modifikatoren und Referenzmodifikatoren. – Zereges