所以说我有一个A类:
class A{
public:
void DoSomething();
void DoSomethingElse(int x);
};
我想要另一个类代理:
class Proxy{
A* a;
public:
void DoSomething(){ a->DoSomething(); }
void DoSomethingElse(int x){ a->DoSomethingElse(x); }
};
但问题是,我希望能够使Proxy
成为模板化的类,以便我可以对任何类进行此类转换....
我能做些什么伎俩吗?
详细说明:
基本上这个代理会占用类中的每个方法,并创建一个具有相同名称的方法,并使用指针来完成方法....你不能使用继承,因为这增加了大小,这实际上就是我的意思试图避免在这里。
我基本上要问是否有类似于在这个问题中覆盖点运算符的东西:Why can't you overload the '.' operator in C++?(那里的答案是“不”)
答案 0 :(得分:0)
考虑具有相同功能的两种类型。
struct A{
void DoSomething(){
std::cout << "A::DoSomething\n";
}
void DoSomethingElse(int x){
std::cout << "A::DoSomething(int)\n";
}
};
struct B{
void DoSomething(){
std::cout << "B::DoSomething\n";
}
void DoSomethingElse(int x){
std::cout << "B::DoSomething(int)\n";
}
};
您的模板化代理可能如下:
template <typename T>
class Proxy{
T a;
public:
void DoSomething(){ a.DoSomething(); }
void DoSomethingElse(int x){ a.DoSomethingElse(x); }
};
它会像这样使用:
int main(){
Proxy<B> b;
Proxy<A> a;
a.DoSomething();
a.DoSomethingElse(0);
b.DoSomething();
b.DoSomethingElse(0);
}
结果:
A::DoSomething
A::DoSomething(int)
B::DoSomething
B::DoSomething(int)
答案 1 :(得分:0)
您要求的内容在C ++中是不可能的,但它也没有用,因为Proxy实例也不是A实例 - 您无法将Proxy实例传递给需要As的方法。 / p>
事实上,在编写这些调用之前,任何事情都可能无法调用您的Proxy对象。鉴于您必须编写所有代理调用,编写您调用的代理方法真的需要额外的工作吗?