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