我面临着以下问题:我有一个V类(比如一个向量),我可以从中产生两个类: CI和I(想想const_iterator和迭代器)。如果我有一个常量V,那么我只能产生CI (再想想迭代器和const_iterator)。
本质上,我想用(CI,ci)代替(const V& v),用(I,i)代替(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,但你可以自由地修改其他所有东西)。
提前感谢您的帮助!
发布于 2010-06-25 02:03:48
如果只使用typedefs呢?
typedef V& I;
typedef const V& CI;编辑:
不是的。请参阅评论:)
https://stackoverflow.com/questions/3112602
复制相似问题