2

同じデータレイアウトを持つ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?
4

1 に答える 1

1

型変換演算子を使用できます

したがって、Second には次の形式のメンバー関数が必要です。 Second::operator First(); ファーストでも同様。これにより、型キャストを必要とせずに暗黙的な変換が行われます。

于 2013-03-15T06:43:59.530 に答える