【问题标题】:C++ Forward method calls to embed object without inheritanceC++ 转发方法调用以嵌入对象而不继承
【发布时间】:2014-07-23 16:19:58
【问题描述】:

我想知道是否可以自动将方法调用转发到嵌入对象,无需继承。例如:

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 方法。即使这个过程可以编写脚本,它仍然很烦人,而且似乎是一个糟糕的解决方案。

【问题讨论】:

  • 您可以让container 表现得像一个智能指针并重载适用的运算符(->、*)
  • stackoverflow.com/a/13885092/1147772 可能会有所帮助。私有继承也没有问题吗?
  • @Drax 是的,也没有问题。
  • @DieterLücking 我会看一下,但我看不出智能指针在这种情况下如何帮助我。问题是 embed 方法仍然没有在更高级别的类中定义(sp 和 container 都没有)。
  • 我认为你应该重新考虑你的设计。为什么要公开嵌入对象方法?也许你觉得需要调用嵌入对象方法的代码应该是容器对象的方法的一部分(例如告诉,不要问)?

标签: c++


【解决方案1】:
#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);
}

Live demo.

我不是在宽恕这种设计,它的封装性很差。

【讨论】:

    【解决方案2】:
    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();     
    }
    

    【讨论】:

    • 签名应该是embed&amp; GetObj()embed GetObj()
    • @Samer 解决方案有效,但不是“用户友好型”(很遗憾,禁止重载 . 运算符...)
    • 可以重载父类的operator(),得到类似`object().embed_method()
    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多