我来自C背景,是CPP的新手。我有一种情况,我需要在将修改对象的对象上调用方法。但是从方法返回时,我需要将对象还原到其先前的状态。为此,我使用了后缀,即“ Bjarne Stroustrup”说明的前缀包装技术。
除了这种技术,我还尝试使用函数模板和函数指针来概括将在修改后的对象上调用的方法。
template < class T >
class Call_proxy {
T* obj;
int ID;
public:
Call_proxy( T* pp ) : obj( pp ), ID( i ) {
}
~Call_proxy() {
obj->setID( ID );
}
T* operator ->() {
return obj;
}
};
template < class T >
class Proxy {
T* obj;
int ID;
public:
Proxy(T* pp) : obj(pp), ID(pp->getID()) { }
Call_proxy<T> operator ->() {
return Call_proxy<T>( obj, ID );
}
};
class X
{
int id;
public:
int getID();
void setID(int ID) { id = ID; }
void somefunction(int, int);
};
template<class X>
void doSomething(int nu, void(X::*fcn)(int, int))
{
Proxy<X> P(x);
P->setID(nu);
(P->*fcn)(nu, 1); //This call generates error on VS2010: Error 1 error C2296: '->*' : illegal, left operand has type 'Proxy<T>'
}
int main()
{
X x;
doSomething<X>(1, &X::somefunction);
}
您能帮我理解VS2010继续抱怨(P->*fcn)(nu, 1);
构造吗?
来自[expr.mptr.oper]:
二进制运算符
->*
将其第二个操作数绑定T
到其第一个操作数,第二个操作数应为“指向其成员的指针”类型,第二个操作数应为“指向……的指针”类型U
,U
其中T
或的一个类T
是明确且可访问的基类。该表达式E1->*E2
将转换为等效形式(*(E1)).*E2
。
即使Proxy<T>
已operator ->()
实施,也没关系,因为:
(P->*fcn)(nu, 1);
不会使用operator ->
。根据语法,它是特殊的。您只能调用fcn
指向的指针X
(或从派生的指针X
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句