我刚刚了解了 std::function 的真正含义以及它的用途,我有一个问题:现在我们基本上有了委托,我们应该在何时何地使用抽象基类,以及何时应该实现通过 std::function 对象提供给泛型类的多态性? ABC在C++11中是否受到致命打击?
就我个人而言,到目前为止的经验是,切换委托比为特定行为创建多个继承类要简单得多……所以我对从现在开始抽象基的有用性感到有点困惑。
优先选择定义良好的接口而不是回调
问题在于std::function
(之前boost::function
)是大多数时候你需要回调一个类方法,因此需要绑定this
到函数对象。然而在调用代码中,你无法知道是否this
还在附近。事实上,你根本不知道还有一个this
因为bind已经将调用函数的签名塑造成调用者所需要的。
当回调尝试触发不再存在的类的方法时,这自然会导致奇怪的崩溃。
你当然可以使用shared_from_this http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/enable_shared_from_this.html并将shared_ptr绑定到回调,但是你的实例可能永远不会消失。给您回电的人现在就参与了您的所有权,而他们甚至不知道这一点。您可能想要更可预测的所有权和破坏。
另一个问题是,即使您可以让回调正常工作,使用回调时,代码可以是过于脱钩。对象之间的关系可能很难确定,从而导致代码可读性降低。然而,接口在适当级别的解耦与接口契约所定义的明确指定的关系之间提供了良好的折衷。您还可以更清楚地指定在这种关系中谁拥有谁、销毁顺序等问题。
另一个问题是std::function
是许多调试器不能很好地支持它们。在 VS2008 和 boost 函数中,您必须通过大约 7 层才能到达您的函数。即使所有其他条件相同,回调是最好的选择,但意外跨过目标会带来纯粹的烦恼和时间浪费std::function
有足够的理由避免它。继承是该语言的核心特征,并且单步进入接口的重写方法是瞬时的。
最后我只是添加我们在 C++ 中没有委托。 C# 中的委托是该语言的核心部分,就像 C++ 和 C# 中的继承一样。我们有一个标准库功能,在我看来,它是从核心语言功能中删除的一层。因此它不会与该语言的其他核心功能紧密集成。相反,它有助于形式化函数对象的概念,而函数对象在很长一段时间内一直是 C++ 习惯用法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)