同じデータレイアウトを持つ2つのクラスAとB(つまり、メンバーではなく関数のみが異なる)を考えると、参照型を暗黙的に変換可能にするにはどうすればよいでしょうか。
struct Storage
{
uint32_t a, b;
};
class First : private Storage
{
int32_t GetA() { return a; }
int32_t GetB() { return b; }
};
class Second : private Storage
{
int64_t GetA() { return a; }
int64_t GetB() { return b; }
};
void FuncF(const First& first);
void FuncS(const Second& second);
// I would like to be able to call like
int main()
{
First f;
Second s;
FuncF(s); // Conversion fails
FuncS(f); // Conversion fails
return 0;
}
パスバイコピーで上記を機能させることclass First : Second
ができます。また、変換を一方向で機能させることができるように継承を使用する場合も同様です。
(上記は不自然な例であることに注意してください。int32_tとint64_tが型を返すのは、uint32_tから構築できるより複雑なクラスであると想像できます)。
明確にするために:私は回避策には興味がありません。データが同じであるという事実に依存して、First
オブジェクトをSecond
参照にバインドしたり、その逆を実行したりできるようにしたいのです。
FuncS(static_cast<Second&>(f)); // This works, is it standard (ie portable)
// and can I define the class so the cast is not necessary?