簡體   English   中英

如何使用朋友訪問STL私人成員

[英]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.

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