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 entreFunctionOs 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?

questionAnswers(1)

yourAnswerToTheQuestion