自动复制所有方法

时间:2016-05-07 23:08:32

标签: c++ templates

所以说我有一个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++?(那里的答案是“不”)

2 个答案:

答案 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对象。鉴于您必须编写所有代理调用,编写您调用的代理方法真的需要额外的工作吗?