Kiedy używać funkcji std :: function zamiast dziedziczenia?

W niektórych przypadkachstd::function może zastąpić dziedziczenie. Poniższe dwa fragmenty kodu są bardzo podobne (o tych samych kosztach podczas wywoływania funkcji, prawie takie samo użycie w sygnaturach iw większości przypadków std :: function nie wymaga od nas tworzenia dodatkowej kopiiA także):

struct Function
{
    virtual int operator()( int ) const =0;
};
struct A
    : public Function
{
    int operator()( int x ) const override { return x; }
};

Za pomocąstd::function, możemy przepisać to jako

using Function = std::function<int (int)>;
struct A
{
    int operator()( int x ) const { return x; }
};

W celu wyjaśnienia, jak te dwa fragmenty są powiązane: oba mogą być użyte w następujący sposób:

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;
}

To drugie podejście jest bardziej elastyczne, ponieważ nie musimy wyprowadzać naszych klas z jakiejś wspólnej klasy bazowej. Jedyny związek międzyFunctionpodobne obiekty opierają się na ich możliwościach. Jeśli chodzi o programowanie zorientowane obiektowo, może być uważane za mniej czyste (ale oczywiście nie pod względem programowania funkcjonalnego).

Poza tym, czy istnieją jakieś inne różnice między tymi dwoma rozwiązaniami? Czy są jakieś ogólne wytyczne, kiedy należy użyć któreś z rozwiązań lub czy jest to tylko kwestiaosobisty pierwszeństwo? Czy są przypadki, w których jedno rozwiązanie przewyższa inne?

questionAnswers(1)

yourAnswerToTheQuestion