是否可以重载操作符,以便捕获它们的特定组合?例如,假设我有一个MyType类型的自定义对象myObject,其中[]已经重载以将此类调用传递给map对象。也就是说,对于以下代码:
int value = myObject["someProp"];
我已经重载了[]
,但在这种情况下,我想知道[]
何时在赋值对象上被调用,并引用属性查找要分配给的对象类型。这样我就可以转换动态属性查找得到的值,等等。任何输入是感激的!
要更深入地了解我想要完成的任务,请参见我的这个相关问题
不能,不能重载返回类型,也不能重载调用出现的上下文(例如赋值等)。
但是,您可以返回一个代理对象,该对象将具有一堆重载转换操作符。如果不知道自己想要做什么,就很难说这种方法能走多远,也很难说这种方法是否明智。如果你想对这样的事情进行类型演绎,你最好的选择是重载operator()
,并传递你将要分配的东西作为一个虚拟参数,即:
MyType myObject;
int value = myObject("someProp", value);
我以前做过类似的工作。具体来说,参见例如:
https://github.com/sgolodetz/hesperus2/blob/master/source/engine/core/hesp/objects/base/ObjectManager.tpp原则上,这是相当简单的:所需要的只是您的操作符返回代理,然后重载操作符你想要接球。在实践中,它可能会导致很多问题;读者会期望(a op1 b) op2 c
有与T tmp(a ip1 b); tmp op2
c
的语义相同。然而,也有一些常见的例外:
-
多维数组中的
operator[]
通常会返回a为了支持[][]
,它自己定义了一个operator[]
正确。 -
更一般地说,无论出于何种原因需要知道的容器当一个值被修改时,将有一个
operator[]
返回a代理;在代理中,赋值定义为设置中的值拥有的容器,并且将有一个到值类型,用于右值上下文中。当然,这意味着像m[i][j].funct()
这样的东西不起作用;然而,典型的是这种Of用于数字类型的矩阵,其中成员函数 -
在需要支持基于的过载解析的上下文中对于目标类型(您的示例),该函数可以返回带有的代理重载转换操作符。你要格外小心这种重载转换操作符通常用于重载解析有歧义,但也有足够的例外这种情况值得一提。(在这里,重要的是操作符的结果几乎总是用于初始化或赋值给一个特定的对象,对象的类型决定了
顺便说一句:我可能会提到,在你给出的例子中,没有赋值;这是一个经典的初始化。在本例中,定义让operator[]
返回一个定义operator int() const
的代理会很管用的。然而,在走这条路之前,你应该非常明确地考虑类的所有用例,并且确保没有实际目标类型是不明确的。
其他答案基本上是正确的,你做不到。Aix暗示了一种带有重载转换操作符的自定义返回类型的解决方案,但正确地指出这不是一件明智的事情。我经常在这条路上冒险,最终隐含的转换,一系列的转换,和模棱两可会在你背后咬你。
虽然我经常需要这个。最终,根据您的需要,我将使用一系列重载函数或模板,可能像这样:
void lookup( int& v, char const * name );
void lookup( double& c, char const * name );
在模板示例中,我创建了全局转换器并执行了以下成员函数:
template<T>
void lookup( T&v, char const* name ) { v = convert<T>( get(name) ); }
如果你想保持返回值作为查找,你必须显式调用模板化函数。
template<T> T get( char const * name ) { ... }
//use
int a = obj.get<int>( "name" );
double b = obj.get<double>( "floaty" );
不,你不能那样做。
更重要的是,疯狂的方式!