Когда использовать std :: function вместо наследования?

В некоторых случаях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подобные объекты основаны на их возможностях. С точки зрения объектно-ориентированного программирования его можно считать менее чистым (но, конечно, не с точки зрения функционального программирования).

Кроме этого, есть ли другие различия между этими двумя решениями? Существуют ли общие рекомендации, когда использовать какое из решений или это только вопросличный предпочтение? Есть ли случаи, когда одно решение превосходит другое?

Ответы на вопрос(1)

Ваш ответ на вопрос