我有一個類定義如下:鑄造對象到其基地的一個子集
template<typename...>
class Base;
template< typename T >
class Base<T>{
//pure virtual functions dependent on T
public:
virtual ~Base() = default;
};
template< typename... Ts >
class Base<Ts...>
: public Base<Ts>...
{
//empty
};
的問題是:
- 有沒有辦法投
Base< T1, T2, T3 >&
到Base< T2, T3 >&
? - 有沒有辦法將
Base< T1, T2, T3 >&
投射到Base< T2, T1, T3 >&
?
編輯: 讓我改一下這個問題沒有模板。 我已經定義爲一類如下:
class Base_int{
public:
virtual int f() = 0;
virtual ~Base_int() = default;
};
class Base_float{
public:
virtual float f() = 0;
virtual ~Base_float() = default;
};
class Base_double{
public:
virtual double f() = 0;
virtual ~Base_double() = default;
};
class IFD
: public Base_int
, public Base_float
, public Base_double
{ };
class IF
: public Base_int
, public Base_float
{ };
class FID
: public Base_float
, public Base_int
, public Base_double
{ };
的問題是:
- 有沒有辦法投
IFD&
到IF&
? - 有沒有辦法將
IFD&
轉換爲FID&
?
編輯2: 爲了進一步澄清: 我impementing,我將使用一個通用的樹容器通用訪問者模式的實現。我使用mixin(CRTP)模式實現訪問類的accept
方法以及訪問者的visit
方法。這些方法是虛擬的,我需要在OP中發佈的層次結構。 有一個名爲IVisitor<Ts...>
的基類實現訪問者的界面,訪問者訪問Ts...
。該接口由IVisitor<T>
類組成 - 就像在OP中一樣。 實現了IVisitor<Ts...>
的具體訪問者的定義如下:
class ConcreteVisitor : public IVisitor<T1, T2, T2, ...>{
//Implementation of the visit methods defined in IVisitor<Ts...>
virtual void visit(T1& v) override { /*...*/ }
virtual void visit(T2& v) override { /*...*/ }
virtual void visit(T3& v) override { /*...*/ }
}
它發生,我認爲這將是有用的,如果在ConcreteVisitor可在IVisitor<Us...>
參觀的東西,其中Us...
是一個子集,或Ts...
置換。爲了做到這一點,我需要將它投射到這個基地 - 因此是一個問題。
'基地'不從'基地< T2, T3 >繼承'既不從'基地' 。您只應該投射到對象正在執行的類中以避免未定義的行爲... –
您是否正在尋找Mixin模式? – lorro
我的狀態仍然有效...'IFD'不會從'IF'繼承,因此您不應該將'IFD'的引用強制轉換爲'IF'。這同樣適用於'FID'。你想要達到什麼目的?因爲也許還有其他的方法可以做到這一點...... –