Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动复制所有方法_C++_Templates - Fatal编程技术网

C++ 自动复制所有方法

C++ 自动复制所有方法,c++,templates,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); } }; 但问题是

假设我有一个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); }
};
但问题是,我希望能够使
代理
成为一个模板化类,这样我就可以对任何类进行这种转换

有什么我能做的吗

详细说明:

基本上,这个代理将使用类中的每个方法,创建一个同名的方法,并使用指针来完成该方法……您不能使用继承,因为这会增加大小,这实际上是我在这里试图避免的


我基本上是在问,是否有类似于覆盖点运算符的东西,如在这个问题中:(答案是“否”)

考虑两种具有相同功能的类型

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";
    }
};

考虑具有相同功能的两种类型

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";
    }
};

C++中的请求是不可能的,但它也不有用,因为代理实例也不是一个实例——您不能将代理实例传递给需要的方法,如./P>


事实上,在您编写这些调用之前,不会有任何东西可能调用您的代理对象。考虑到你必须写所有代理调用,写你所调用的代理方法真的是额外的工作吗?

< p>你在C++中不可能要求什么,但是它也没有用,因为代理实例也不是一个实例——你不能把代理实例传递给需要的方法。

事实上,在您编写这些调用之前,不会有任何东西可能调用您的代理对象。考虑到您必须编写所有代理调用,编写您正在调用的代理方法真的需要这么多额外的工作吗?

@kfsone我不确定我是否理解您的问题您想要的只是一个模板类?或者你可能是在继承。@TrevorHickey这个和继承之间的主要区别是结果类的大小,这就是为什么我这样做的原因。(代理的大小是sizeof(ptr_t))您可以提供
操作符->
,但除此之外,您不能。为什么要封装指针而不是直接使用它,或者使用智能指针?我们可能没有看到导致您的问题的全部情况。@kfsone我不确定我是否理解您的问题您想要的只是一个模板类?或者你可能是在继承。@TrevorHickey这个和继承之间的主要区别是结果类的大小,这就是为什么我这样做的原因。(代理的大小是sizeof(ptr_t))您可以提供
操作符->
,但除此之外,您不能。为什么要封装指针而不是直接使用它,或者使用智能指针?我们可能没有看到导致您的问题的全部情况。我想我可能强调得不够,但这必须适用于您命名的任何类……std::vector、myRandomClass等。。这只适用于那些具有特定函数的类……我将在问题中尝试更清楚地说明这一点。因此,如果类没有特定的方法,那么当您调用它时,您希望代理做什么?我想我明白你的意思了。您希望代理从其派生的任何对象继承方法。没错,除了不继承与继承相关的所有大小之外,我想我可能没有足够强调这一点,但这必须适用于您命名的任何类…std::vector、myRandomClass等。。这只适用于那些具有特定函数的类……我将在问题中尝试更清楚地说明这一点。因此,如果类没有特定的方法,那么当您调用它时,您希望代理做什么?我想我明白你的意思了。您希望代理从其派生的任何对象继承方法。确切地说,除了不继承与inheritingWell关联的所有大小之外,如果您提供另一个模板参数,该参数的基类为
a
,则可能会很有用,但是,是的,我确实明白你的观点。事实上,如果你给出另一个模板参数,它的基类是
a
,它可能会很有用。但是,是的,我明白你的观点
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)