[英]How to use friend to access STL private member
當我這樣做時...
auto t = typeid(float);
...我得到:
錯誤C2248'type_info :: type_info':無法訪問在類'type_info'中聲明的私有成員
當然,我知道我可以做到...
auto t = typeid(float).name();
但是,如果我想使用第一個表達式,我該如何篡改type_info類並使用friend來實現我的目標? 有什么建議么?
您不能讓您的班級成為標准班級的friend
。
一個typeid
表達式是一個左值,因此您可以簡單地將引用綁定到它:
auto& t = typeid(float);
您無法執行此操作的原因是復制構造函數,並且std::type_info
的賦值運算符被標記為每個[type.info]的delete
。 所以
auto t = typeid(float);
將嘗試調用將失敗的復制構造函數。
正如TartanLlama在他的回答中指出的那樣,您可以使用
auto& t = typeid(float);
Error C2248 'type_info::type_info': cannot access private member declared in class 'type_info'
此錯誤消息引用了您嘗試使用auto t = typeid(float);
調用的type_info
的副本構造函數auto t = typeid(float);
。
但是,如果我想使用第一個表達式,我該如何篡改
type_info
類並使用friend來實現我的目標? 有什么建議么?
即使您可以操縱type_info
的定義(您也無法做到),您可能會怎么做? 復制構造函數不是私有的,因為它需要向您隱藏,但因為該語言未定義復制type_info
含義。 實際上,即使您以某種方式將成員函數聲明為public
函數(這已經純粹是假設的),也沒有定義,因此也就沒有鏈接器錯誤。
我不知道為什么GCC在這里的錯誤消息中沒有更具體。 使用C ++ 11時,復制構造函數不僅是private
而且已刪除 ,這就是不能使用它的原因。 碰巧的是,MSVC的錯誤消息更合適,因為它說:
error C2280: 'type_info::type_info(const type_info &)' :
attempting to reference a deleted function
解決問題的現代C ++ 11解決方案是使用std::type_index
,它是std::type_info
周圍的可復制包裝器。 這是一個例子:
#include <typeindex>
int main()
{
auto t = std::type_index(typeid(float));
}
類std::type_info
已刪除副本構造函數。
type_info(const type_info& rhs) = delete; // cannot be copied
^^^^^^^^
另一方面(5.2.8類型識別)
1 typeid表達式的結果是靜態類型const std :: type_info(18.7.1)和動態類型const std :: type_info或const name 的左值 ,其中name是從std :: type_info公開派生的實現定義的類,保留18.7.1.69中描述的行為。lvalue 引用的對象的生存期延長到程序的結尾 。 程序末尾是否為std :: type_info對象調用析構函數是不確定的。
所以你可以寫例如
#include <iostream>
int main()
{
decltype( auto ) t = typeid( float );
std::cout << t.name() << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.