编辑:马上要弄清楚,这是有关现代C++编译器的语言能力的问题。这不是关于特定目标的问题。在不先阐明这一抽象概念的情况下,很难描述这样一个抽象的概念,而且我已经意识到,有些困惑围绕着通常要做的事情而不是可能要做的事情。这是一个非常抽象的问题。这里什么都不会编译,这是有目的的。同样,我不是在问如何使这种特定情况起作用,而是在问是否有办法让C++识别我想做的事情(通过模板化或某种auto-> decltype技巧,如果甚至有可能)。
我不是C++的新手,但肯定不是专家。自从我重新发现语言的力量以来,这就是我一直在努力的一个基本问题。此处的最终目标是根据调用上下文优雅地(并且使用尽可能少的代码)转发适当的多态返回值。例如...
class A {
public:
A& foo() {
// do something mutant fooish
return *this;
};
};
class B: public A {
public:
B& bar() {
// do something mutant barish
return *this;
};
};
int main(int argc, char** argv) {
B yarp;
yarp.foo().bar();
};
编译错误。有道理,C++旨在假定您对自己的工作一无所知(这使其高度可优化,但有时会感到痛苦……一种高级-中级OOP语言)。
显而易见的C++编译器已经达到了这样的程度:它们不仅知道您要的内容(A()。foo()和B()。foo()的工作原理),而且还了解您的要求为此(在C++ 11中,自动yarp = B(),编译器知道yarp是B的实例)。有没有一种方法可以优雅地利用这一功能,而不必重现一堆“使用”语句或包装方法(奇怪的是,根据gcc二进制文件的反汇编,它们并没有得到优化)?
那这里有把戏吗?我根本没有在网上学到的东西。自动-> decltype技巧还是模板技巧?例:
class A {
public:
template <typename R>
R& foo() {
// do something fooish
return (R&)*this;
};
};
class B: public A {
public:
using A::foo<A>; // << even this would be better than nothing (but no where near optimum)
B& bar() {
// do something barish
return *this;
};
};
更简单的东西吗?如果将此概念扩展到用于引用计数和gc释放的代理模板类的运算符,则很显然这会带来问题。在此先感谢您提供的任何帮助(哦,并且是关于stackoverflow的第一篇文章,因此,如果我遇到任何格式错误的问题,或者您对更好的结构化文章有建议,请在此道歉,并指出)。
最佳答案
显而易见的解决方案是将其分为两行:
yarp.foo();
yarp.bar();
或者,也可以使用static_cast获取对B&的引用,因此
static_cast<B&>(yarp.foo()).bar();
同意,这稍微冗长一些,但将继承关系中的多个成员函数调用以一行形式链接在一起,这对于C++来说是非常不寻常的语法。只是并没有提出太多建议,因此该语言不能很好地支持该习语。我从未遇到过遇到此问题的情况。
如果要设计一些可链接的功能,则可以使用其他更好的习惯用法。一个例子是Boost的范围适配器,它使运算符|实现链接。
编辑:另一个选项是在B&中重载foo():
class B: public A {
public:
B& foo() { A::foo(); return *this; }
B& bar() {
// do something mutant barish
return *this;
};
};