【发布时间】:2013-05-02 09:08:28
【问题描述】:
在某些情况下std::function 可以代替继承。以下两个代码 sn-ps 非常相似(调用函数时的成本大致相同,签名中的用法几乎相同,并且在大多数情况下 std::function 也不需要我们额外复制A) :
struct Function
{
virtual int operator()( int ) const =0;
};
struct A
: public Function
{
int operator()( int x ) const override { return x; }
};
使用std::function,我们可以将其重写为
using Function = std::function<int (int)>;
struct A
{
int operator()( int x ) const { return x; }
};
为了更清楚地说明这两个sn-ps是如何关联的:两者都可以按如下方式使用:
int anotherFunction( Function const& f, int x ) { return f( x ) + f( x ); }
int main( int argc, char **argv )
{
A f;
anotherFunction( f, 5 );
return 0;
}
后一种方法更灵活,因为我们不必从某个公共基类派生我们的类。 Function-like 对象之间的唯一关系是基于它们的功能。就面向对象的编程而言,它可能被认为不太干净(但就函数式编程而言,当然不是)。
除此之外,这两种解决方案之间还有其他区别吗?是否有任何通用指南何时使用哪种解决方案,或者这只是个人偏好的问题?是否存在一种解决方案优于另一种解决方案的情况?
【问题讨论】:
-
也许我只是粗,但我看不出这两个例子有什么关系。
-
IMO 您应该始终使用
std::function或通常的模板方法template<Callable>,因为它们是惯用的。滚动您自己的Function类型不适用于 所有 可调用类型。 -
std::function是 C++ 语言。所以我会选择这个,或者会使用template(类模板和函数模板)。
标签: c++ c++11 boost-function