我面临以下问题:我有一个 V 类(比如一个向量),我可以从中生成两个类:CI 和 I(想想 const_iterator 和迭代器)。如果我有一个 const V,那么我只能产生 CI(再次考虑迭代器和 const_iterator)。
基本上我想用(CI ci)和(V&v)用(I i)代替(const V&v)。此外,我希望仍然能够将 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;
}
请注意,我可以在 V 中定义转换运算符(它是否等效?)而不是在 CI 和 I 中定义构造函数。现在:
V v;
const V cv;
fun2( v );
fun2( cv );
fun( v ); //AMBIGUOUS!
fun( cv );
有没有办法在不添加任何额外间接性的情况下解决这个问题(即不能修改 fun 函数,并且 v 必须直接传递给 fun,但您可以自由修改其他所有内容)。
预先感谢您的任何帮助!