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