在某些情况下std::function
可以代替继承。以下两个代码片段非常相似(调用函数时的成本大致相同,签名中的用法几乎相同,并且在大多数情况下 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; }
};
为了更清楚地说明这两个片段是如何相关的:它们都可以通过以下方式使用:
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
是基于它们的能力。就面向对象的编程而言,它可能被认为不太干净(但就函数式编程而言,当然不是)。
除此之外,这两种解决方案之间还有其他区别吗?何时使用哪种解决方案是否有任何一般指导方针,或者只是个人喜好问题?是否存在一种解决方案优于另一种解决方案的情况?