簡體   English   中英

C ++在不知道其參數的情況下保留對模板實例的引用

[英]c++ hold reference to template instance without knowing its arguments

我想知道如何創建對我不知道具體模板參數類型的模板化類的引用或指針。

例如我有

vector<int>   a;
vector<float> b;

現在,我希望能夠創建一個變量(在這種情況下為c),該變量可以包含對a或b的引用或對vector的任何其他特殊化,例如:

vector<>& c; // <- generic reference to all specializations of class vector<T>
c = a;
cout << c.size() << endl;

c = b;
cout << c.size() << endl;

我知道一個事實,那就是不可能調用push_back或任何其他接受或返回模板類型參數的操作,但是我只想調用諸如size()等方法,這些方法不需要了解具體的模板參數。

非常感謝您的提前幫助!

那是不可能的。 模板是編譯器從中生成多個不相關類型的源。 如果要創建通用代碼,則可以:

  • 為此使用類型擦除,盡管可能不值得付出努力
  • 或者您可以編寫與模板的不同專業相匹配的模板(它們本身會生成不同的功能,但您不必編寫每個模板)
  • 或者,如果您控制模板,則可以使用基本類型的繼承,並將常用功能(所有專業中都存在且簽名不變的功能)移至基本類型。

您想要的是運行時多態性。 在C ++中,無論是否使用模板,都只能通過繼承和虛擬方法來完成。

因此,您唯一的選擇是創建一個基接口,然后創建一個繼承該基類的模板化類。 然后,您所有的專門類都共享同一個繼承的類,從中可以調用虛函數。

不幸的是,如果您無法控制模板化類(例如vector ,則無法使用此方法,因此在這種情況下,您無法執行此方法,除非構建一個提供常見行為並執行強制轉換的新類。在后台(類型擦除是一種自動執行此操作的增強模板方法,但我寧願自己寫我的具體情況下的類)。

我在這里的帖子可能會讓您感興趣。

暫無
暫無

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

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