std::shared_ptr 中派生的 class 的模板规范
Template specification for a derived class in an std::shared_ptr
在这个简单的例子中,我如何为 Derived
class 提供模板专业化,假设 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
时,我希望能够使用单独的模板。
此处正确的工具是使用 dynamic_cast。这是运行时信息,因此必须在运行时查询。
类似
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
}
这只是模板和多态性不能很好地相互配合的另一种情况,主要是因为编译 time/runtime 二分法。
在这个简单的例子中,我如何为 Derived
class 提供模板专业化,假设 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
时,我希望能够使用单独的模板。
此处正确的工具是使用 dynamic_cast
类似
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
}
这只是模板和多态性不能很好地相互配合的另一种情况,主要是因为编译 time/runtime 二分法。