2016-05-05 21 views
0

私はstd :: tupleを学習します。std :: tuple_elementと参照

は、我々が持っているのをみましょう:

struct test_struct{}; 

私は

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

を書き、私はタイプ

struct test_struct & 

を期待していた。しかし、私が受け取っ:

struct test_struct 

どのように私はタイプ構造体test_struct &(好ましくはstd11を使用して)を抽出することができますか?

ありがとうございました。

+3

'、すなわち'型ID(INT&)==型ID(INT) 'のようにそれを使用します。本当の質問は、なぜあなたはこれをしたいのですか?それを(つまり、いくつかのMVCE)提供した場合、それが期待どおりに動作していない理由を診断することができます。しかし、今のところ、すべてが期待どおりであると思われます。 – GManNickG

答えて

0

タイプが参照型である場合typeidオペレータは、参照タイプの作業

§5.2.8/ 4-5
は、結果が表すstd::type_infoオブジェクトを参照しないので参照型。すべての場合において

は、CV-修飾子は、あなたは、CV-修飾子と参照型や型の名前を見つけるために、いくつかのラッパーを書くことができます(つまり、typeid(T)==typeid(const T)ある)

型IDによって無視されます。

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

と参照を取り除きtypeid`

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

ありがとうございます。私は右の参照型を受け取ったtuple_element_tから理解しています、その唯一の出力の問題は私が参照を参照してくださいない? –

+0

@JDiOrEximenはい、 'typeid'はconst修飾子と参照修飾子を取り除きます。 – Zereges

関連する問題