我有一个看起来像这样的课程:
class Base
{
public:
Base( int val = 0 ) : value( val ) {};
int value;
};
类A
和B
继承Base
:
class A : public Base {};
class B : public Base {};
我还有一个模板类,其签名类似于:
template < class T >
class Temp
{
public:
Temp ( const T & val = T() ) : m_T( val ) {};
T m_T;
};
我要做的是有一个函数,它指向Temp<Base>
个实例并对它们采取行动:
void doSomething ( Temp< Base > * a, Temp< Base > * b )
{
(*a) = (*b);
};
最后,我希望将Temp<A>
和Temp<B>
个实例传递给doSomething()
,例如:
void
main()
{
Temp<A> a;
Temp<B> b;
doSomething( &a, &b) ;
};
显然,这不起作用,因为Temp<A>
和Temp<B>
没有关联,并且类型之间没有隐式转换(即使A
和B
是{{ 1}})。
有什么方法可以解决这个问题?任何意见都将不胜感激。
提前感谢您的帮助。
答案 0 :(得分:1)
template<typename T, typename U>
void doSomething ( Temp< T > * a, Temp< U> * b )
{
(*a) = (*b);
};
答案 1 :(得分:0)
如果你不小心,你会失去继承关系的很多用处,但是如果你使Temp派生出一个公共基类,你可以在它的派生类中创建模板化成员。您最终要做的是将A和B的公共接口移动到BASE,然后进行专业化(如何实际执行这些功能),您可以参考BASE中的TempA或TempB成员(A和B被包围编辑不会让我明确。)。