"模板多态"在调用基类型的模板化参数的函数时,使用派生类型?

Tra*_*isG 3 c++ templates

我有一个模板类:

template <class T>
class TemplateClass
{
   //irrelevant what this class does
}
Run Code Online (Sandbox Code Playgroud)

还有两个类,一个基类和一个类,它们来源于它:

class Base
{
    //does whatever
}

class Derived : public Base
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

void DoSomething(const TemplateClass<Base *> &tc)
{
   //do something
}
Run Code Online (Sandbox Code Playgroud)

以及代码中的其他地方:

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

DoSomething(a); //Works
DoSomething(b); //Doesn't work, but I'd like it to work
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个,而不必手动重载DoSomething for Derived*?

Cat*_*lus 5

遗憾的是,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*"
    );

    // ...
}
Run Code Online (Sandbox Code Playgroud)

在ideone上演示.