我目前的情况是这样的结构:
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;
};
答案 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;
};
但是采用人工转发的合成方式似乎更自然。