类方法调用变量方法

时间:2018-11-27 16:12:34

标签: c++ class syntax simplify

我目前的情况是这样的结构:

class Foo {
    public:
        void call() {
            b.call();
        }
    private:
        Bar b;
};

class Bar {
    public:
        void call() {
            std::cout << "Hello there" << std::endl;
        }
};

int main() {
    Foo f;

    f.call(); // This calls directly the b.call() function
}

是否存在可以直接使Foo.call函数直接调用存储为变量的类内部函数的语法?

基本上,有没有一种语法可以做到:

class Foo {
    public:
        void call() -> b.call
    private:
        Bar b;
};

3 个答案:

答案 0 :(得分:3)

您正在谈论的是语言级别的 delegate 构造。某些语言对此提供了内置支持,但C ++没有。您必须像对待“艰难的方式”那样做。

如果这确实很普遍,您可以定义一个宏,但是拥有丑陋的代码通常比混淆或误导性代码更好。

答案 1 :(得分:2)

通常没有必要尝试像这样帮助编译器。编译器非常擅长优化这种事情。您无需告诉编译器Foo::call实际上只是一个Bar::call。编译器会解决。考虑一个稍微调整的示例:

extern void DisplayMessage(char const*);

class Bar {
public:
  void call() {
    DisplayMessage("Hello there");
  }
};

class Foo {
public:
  void call() {
    b.call();
  }
private:
  Bar b;
};

int main() {
  Foo f;

  f.call(); // This calls directly the b.call() function
}

当我使用Clang 7.0和-O3进行编译时,得到以下信息:

main:                                   # @main
    push    rax
    mov     edi, offset .L.str
    call    DisplayMessage(char const*)
    xor     eax, eax
    pop     rcx
    ret

请注意,编译器已完全删除了对象,仅直接调用了DisplayMessage函数。

答案 2 :(得分:0)

您可能使用以下简短代码:

class Bar {
public:
    void call() const {
        std::cout << "Hello there" << std::endl;
    }
};

class Foo : private Bar // private is superfluous here, as we use class instead of struct
{
public:
    using Bar::call;
};

但是采用人工转发的合成方式似乎更自然。