Derived在這種簡單的情況下,我將如何為類提供模板特化,假設Base無法更改 - 在我的真實代碼中,Base是一個我無法更改的庫。
#include <iostream>
#include <memory>
class Base
{
public:
virtual void foo() { std::cout << "In base\n"; }
};
class Derived: public Base
{
public:
virtual void foo() { std::cout << "In derived\n"; }
};
template<typename T>
void wibble(T &&baz)
{
std::cout << "In wibble for default\n";
baz->foo();
}
// How do I provide a specialisation here?
//template<typename what_goes_here>
//void wibble(what_goes_here &&baz)
//{
// std::cout << "In wibble for derived\n";
// baz->foo();
//}
int main()
{
std::shared_ptr<Base> bar = std::make_shared<Derived>();
bar->foo();
wibble(bar);
return 0;
}
當共享指標中包含的實際型別為Derived.
uj5u.com熱心網友回復:
這里的正確工具是使用 dynamic_cast<Derived*>。這是運行時資訊,因此必須在運行時查詢。
就像是
void wibble(std::shared_ptr<Base*> baz){
if(auto derived =dynamic_cast<Derived*>(baz.get()){
// user derived pointer.
}
}
應該允許您實作與您想要的類似的東西。如果您的鍵盤丟失*,您也可以(感謝 Eljay)
if(auto derived = std::dynamic_pointer_cast<Derived>(baz){
// use derived
}
這只是模板和多型性不能真正相互配合的另一種情況,主要是因為編譯時/運行時二分法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/390872.html
下一篇:什么相當于rails7中的“Rails.config.action_view.raise_on_missing_translations”?
