类方法来调用变量方法



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

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

您谈论的是语言级别的委托构造。有些语言有内置的对此的支持,但C++没有。你必须像现在这样"艰难地"去做。

如果这是一个非常普遍的事情,你可以定义一个宏,但通常最好有丑陋的代码,而不是令人困惑或误导的代码。

通常没有必要尝试这样帮助编译器。编译器非常擅长优化这类事情。您不需要告诉编译器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函数的直接调用。

您可能有更短的代码:

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

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

相关内容

  • 没有找到相关文章

最新更新