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