Quando usar std :: function em vez de herança?
Em alguns casosstd::function
pode substituir herança. Os dois trechos de código a seguir são muito semelhantes (sobre os mesmos custos ao chamar a função, quase o mesmo uso em assinaturas e, na maioria dos casos, std :: function não exige que façamos uma cópia extra deA
também):
struct Function
{
virtual int operator()( int ) const =0;
};
struct A
: public Function
{
int operator()( int x ) const override { return x; }
};
Usandostd::function
, podemos reescrever isso como
using Function = std::function<int (int)>;
struct A
{
int operator()( int x ) const { return x; }
};
Para tornar mais claro, como os dois trechos estão relacionados: ambos podem ser usados da seguinte maneira:
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;
}
A última abordagem é mais flexível, porque não precisamos derivar nossas classes de alguma classe base comum. A única relação entreFunction
Os objetos similares são baseados em seus recursos. Em termos de programação orientada a objetos, ela pode ser considerada menos limpa (mas não em termos de programação funcional, é claro).
Além disso, existem outras diferenças entre as duas soluções? Há alguma orientação geral quando usar qual das soluções ou é apenas uma questão depessoal preferência? Existem casos em que uma solução supera a outra?