C ++過負荷機能コールの暗黙的変換とあいまいさ
-
29-09-2019 - |
質問
私は次の問題に直面しています:私はクラスV(たとえばベクター)を持っています。そこから2つのクラスを作成できます:CIとI(Const_iteratorとIteratorの考え)。 const vを持っている場合、CIのみを生成することができます(再びIteratorとconst_iteratorについて考えてください)。
基本的に、(CI CI)と(V&V)を(I I)と(const V&V)に共有したいと思います。さらに、V objをA IまたはA CIを期待する関数に直接渡すことができるようにしたいので、Vとconst VからCIおよびIへの暗黙的な変換を行うことができます。
私が直面している問題は、過負荷機能が(const V&V)と(V&V)を区別できるが、私がV objに合格したときに(CI CI)と(I)を「区別」できないことです。
コード:
struct V {};
struct I
{
I( V& v ){}
};
struct CI
{
CI( const V& v ){} //I would like to say const only
};
void fun( I i )
{
double x = 1.0;
}
void fun( CI ci )
{
double x = 2.0;
}
void fun2( V& v )
{
double x = 1.0;
}
void fun2( const V& v )
{
double x = 2.0;
}
CIとIでコンストラクターを定義する代わりに、VでコンバージョンオペレーターをV(同等ですか?)で定義できたことに注意してください。
V v;
const V cv;
fun2( v );
fun2( cv );
fun( v ); //AMBIGUOUS!
fun( cv );
追加の間接を追加せずにこの問題を解決する方法はありますか(つまり、楽しい関数を変更することはできず、Vは楽しみに直接渡す必要がありますが、他のすべてを自由に変更できます)。
どんな助けをありがとうございました!
解決
ここで必要なのは、明示的なコンストラクターです。
struct I
{
explicit I( V& v ){}
};
struct CI
{
explicit CI( const V& v ){} //I would like to say const only
};
C ++プログラマが多すぎると、コンストラクターの明示的なキーワードを見落としています。すべての統一されたパラメーター化されたコンストラクターは、デフォルトで明示的である必要があります。暗黙のコンストラクターは、これらのような曖昧さの問題を招き、非常に間抜けで回り道の変換プロセスにつながり、問題のある非常に非効率的なコードに簡単につながる可能性があります。
今、あなたは設定されており、あいまいさの問題が解決しました。明示的なコンストラクターがいなければ、この曖昧さの問題を防ぐことはできません。
クライアントコードの場合、そのコンバージョンを明示するように変更する必要があります。
V v;
const V cv;
fun2( I(v) );
fun2( CI(cv) );
fun( I(v) );
fun( CI(cv) );
このような構文は、IまたはCIのオブジェクトを作成するために必要になりますが、それは良いことです。誰も誤って曖昧さの問題を導入することはできません。
他のヒント
ただ使用するのはどうですか typedef
s?
typedef V& I;
typedef const V& CI;
編集:
いいえ。コメントを参照してください:)