私は次の問題に直面しています: クラス V (ベクトルなど) があり、そこから CI と I (const_iterator と iterator を考えてください) の 2 つのクラスを生成できます。const V がある場合は、CI しか生成できません (ここでも iterator と const_iterator を考えてください)。
基本的に、(const V& v) を (CI ci) に、(V& v) を (I i) に置き換えたいと思います。さらに、V obj を I または CI を期待する関数に直接渡すことができるようにしたいため、V および const V から CI および I への暗黙的な変換が行われます。
私が直面している問題は、オーバーロードされた関数は (const V& v) と (V& v) を区別できますが、V obj を渡すときに (CI ci) と (I 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;
const V cv;
fun2( v );
fun2( cv );
fun( v ); //AMBIGUOUS!
fun( cv );
余分な間接化を追加せずにこの問題を解決する方法はありますか (つまり、fun 関数は変更できず、v を fun に直接渡す必要がありますが、他のすべてを自由に変更できます)。
助けてくれてありがとう!