C++ 自动复制所有方法
假设我有一个a级: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); } }; 但问题是
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)