C++ C++;转发方法调用以嵌入不带继承的对象
我想知道是否有可能在不继承的情况下自动将方法调用转发到嵌入对象。例如:C++ C++;转发方法调用以嵌入不带继承的对象,c++,C++,我想知道是否有可能在不继承的情况下自动将方法调用转发到嵌入对象。例如: class embed { public: void embed_method() {return}; }; class container { public: void container_method() {return;} private: embed obj; }; int main() { container object; object.container_metho
class embed
{
public:
void embed_method() {return};
};
class container
{
public:
void container_method() {return;}
private:
embed obj;
};
int main()
{
container object;
object.container_method(); // Local method call
object.embed_method(); // 'Forward' call, obviously doesn't work
}
当不可能/不推荐从基类继承时,它可能非常有用。
目前,我唯一的选择是手动将embed
类方法重写到container
类中,然后从container
类调用embed
方法。即使这个过程可以编写脚本,它仍然很烦人,而且似乎是一个糟糕的解决方案。\include
class embed
{
public:
void embed_method(){return};
};
class container
{
public:
void container_method(){return;}
embed GetObj(){return obj;}
private:
embed obj;
};
int main()
{
container object;
object.container_method(); // Local method call
object.GetObj().embed_method();
}
类嵌入{
公众:
void embeddedMethod(){}
};
类容器{
私人:
嵌入;
公众:
void containerMethod(){}
模板
R转发(R(嵌入::*函数)(Args…,Args&&…Args){
返回(嵌入。*函数)(标准::转发
我不是在容忍这种设计,它的封装性非常差。您可能会使容器
的行为像一个智能指针,并重载适用的运算符(->,*)可能会有帮助。私有继承也不成问题吗?@Drax是的,也不成问题。@DieterLücking我会看一看,但我看不出智能指针在这种情况下对我有什么帮助。问题是,embed
方法仍然没有在更高级别的类中定义(sp和容器
)。我认为您应该重新考虑您的设计。为什么要公开嵌入式对象方法?可能您认为需要调用嵌入式对象方法的代码应该是容器对象方法的一部分(例如,告诉、不问)?签名应该是embed&GetObj()
或embed GetObj()
@Samer解决方案可以工作,但不“用户友好”(很遗憾,禁止重载
运算符…)可以重载父类的运算符()
,以获得类似`object().embed_method()的内容
#include <utility>
class Embed {
public:
void embedMethod() { }
};
class Container {
private:
Embed embed;
public:
void containerMethod() {}
template<typename ...Args, typename R>
R forward( R (Embed::* function)(Args...), Args &&...args) {
return (embed.*function)(std::forward<Args>(args)...);
}
};
int main() {
Container c;
c.containerMethod();
c.forward(&Embed::embedMethod);
}