我有一个模板类:
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*?
遗憾的是,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)
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |