gpt4 book ai didi

c++ - "template polymorphism"为基类型的模板化参数调用函数时,具有派生类型?

转载 作者:太空狗 更新时间:2023-10-29 20:47:04 24 4
gpt4 key购买 nike

我有一个模板类:

template <class T>
class TemplateClass
{
//irrelevant what this class does
}

还有两个类,一个基类和一个从它派生的类:

class Base
{
//does whatever
}

class Derived : public Base
{
}

现在我想组装一个函数,它可以处理模板化类型 Base* 的 TemplateClass 以及模板化类型 Derived* 的 TemplateClass,而不必为这两种类型分别实现该函数。

在代码中,这是我希望能够做到的:

void DoSomething(const TemplateClass<Base *> &tc)
{
//do something
}

代码中的其他地方:

TemplateClass<Base *> a;
TemplateClass<Derived *> b;

DoSomething(a); //Works
DoSomething(b); //Doesn't work, but I'd like it to work

有没有一种方法可以实现这一点而不必为 Derived* 手动重载 DoSomething?

最佳答案

遗憾的是,C++ 不支持模板协变,因此您无法自动执行此操作。作为解决方法,您可以执行以下操作:

template <typename T>
void DoSomething(const TemplateClass<T*>& tc) {
// in C++03, use BOOST_STATIC_ASSERT and boost::is_convertible
static_assert(
std::is_convertible<T*, Base*>::value,
"Template argument must be convertible to Base*"
);

// ...
}

Demo on ideone .

关于c++ - "template polymorphism"为基类型的模板化参数调用函数时,具有派生类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6558633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com