我正在使用另一个使用函数的人员代码
doSomething
取决于两个模板:stage
和T
。
我知道他们可以采取各州(Micro
,
DerivedOne
)或(Macro
,DerivedTwo
)
在doSomething
我现在需要将DerivedTwo
投放到BaseTwo
和DerivedOne
投放到BaseOne
。如代码所示,转换只是
当舞台是正确的,即他们总是o.k.
我仍然遇到编译错误,因为无法转换DerivedOne
到BaseTwo
即使从未进行此演员表。
问题:
如何在不更改所涉及的类和模板的一般结构的情况下编译此代码? (这会破坏代码的许多其他部分)。
我最好只想更改doSomething
。
演员出现在b.c.我需要调用一个可以重载的函数
采取BaseOne
或BaseTwo
。因此,要传递DerivedTwo
我需要明确地投射它。
aTest.h
enum Stage {
Micro,
Macro
};
class BaseOne
{
int a;
};
class BaseTwo
{
int b;
};
class DerivedOne : public BaseOne
{
int c;
};
class DerivedTwo: public BaseTwo, public BaseOne
{
int d;
};
template <Stage stage>
class Doer{
template <class T>
void doSomething( T t);
};
aTest.cpp
#include "aTest.h"
template< Stage stage >
template < class T >
void Doer<stage>::doSomething(T t) {
//depending on stage we need to cast t to BaseOne or BaseTwo
if( stage == Micro )
{
overloadedFunction( (BaseOne) t );
}
if( stage == Macro )
{
overloadedFunction( (BaseTwo) t );
}
}
template class Doer<Micro>;
template class Doer<Macro>;
template void Doer<Micro>::doSomething(DerivedOne t);
template void Doer<Macro>::doSomething(DerivedTwo t);
答案 0 :(得分:1)
您可以使用:
x
现在为什么这会派上用场?
因为现在if语句包含if constexpr (stage == Macro)
overloadedFunction( (BaseTwo) t );
,它将在编译时评估其条件,并且只有在条件求值为true时才会编译它的主体。这意味着身体可能是不正确的,但代码能够编译。阅读更多here。