私は持っている
class Wrapper : Base
{
Wrapper(WrappedObject& obj)
//...
};
void fun(Base& b);
fun
インスタンスで直接呼び出せるようにしたいのですWrappedObject
が、そのような暗黙的な変換は可能ですか? どうやって?
edit : http://ideone.com/ilfE8まだこの例を機能させることができません。何を変更する必要がありますか? ありがとう
私は持っている
class Wrapper : Base
{
Wrapper(WrappedObject& obj)
//...
};
void fun(Base& b);
fun
インスタンスで直接呼び出せるようにしたいのですWrappedObject
が、そのような暗黙的な変換は可能ですか? どうやって?
edit : http://ideone.com/ilfE8まだこの例を機能させることができません。何を変更する必要がありますか? ありがとう
継承を公開します。
class Wrapper : public Base
そのままでは、それはis-a
関係ではありません。private
継承 (クラスのデフォルト) はhas-a
関係を表します。
class Wrapper : Base
と同等です
class Wrapper : private Base
編集: コメントによると、一時的なものが作成されるため、参照は const である必要があります。
fun
非 const 参照によってパラメーターを実際に取得する必要がある場合、これを 1 つのステップで実行することはできません。その理由は、呼び出すにはからfun
一時を作成する必要があるためですが、この一時を非 const 参照にバインドすることはできません。Wrapper
WrappedObject
fun
パラメータを const 参照として使用できる場合は、継承を他の回答に見られるように変更し、 make のパラメータを const にするだけpublic
ですfun
。その後、あなたが求めたことを正確に行うことができます。
fun
非 const 参照によってパラメーターを取得する必要がある場合は、名前付きの一時オブジェクトを作成して渡す必要があります。
Wrapper wrap(wrapped_obj);
fun(wrap);
最後に、暗黙のコンストラクターは便利ですが、多くの場合、コードの理解を妨げ、見つけにくいバグにつながる可能性があることに注意してください。コードを 1 回だけ記述し、(暗黙的な変換コンストラクターではなく) 変換を明示的に記述すると、コードが読みやすくなり、バグがより明確になることに注意してください。
編集: さらに調べてみると、C++ で元の目標を達成できるとは思えません。(残念ながら)ルールにより、複数の暗黙的なステップ (construct temp Wrapper
、暗黙的なキャスト to Base
) を使用して関数を呼び出すことはできません。あなたはそれを助けなければならないでしょう。
おそらく最も簡単な方法はオーバーロードですが、別の方法は、それ自体への呼び出しでfun(const Wrapper& w) { fun(static_cast<const Base&>(w)); }
一時オブジェクトを明示的に作成することです。これには、将来の読者にとってもう少し明示的であるという利点があります。Wrapper
fun