【发布时间】:2022-01-23 11:36:44
【问题描述】:
在这种简单的情况下,假设Base 无法更改,我将如何为Derived 类提供模板特化 - 在我的真实代码中,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 时,我希望能够使用单独的模板。
【问题讨论】:
-
在代码中你有一个
shared_ptr<Base>的实例。它指向Derived的事实在技术上是运行时信息。所以你不能在编译时消除两者的歧义。您可以调用运行时动态转换来确定什么是什么,但仅此而已。 -
您不能根据
shared_ptr的运行时类型专门化模板。如果wibble无法修改,那么您将无能为力。