2015-02-06 123 views
5

我是比較新的C++,這是我的第一個職位,所以,請溫柔;-)動態傳遞給函數對象STL

我明白如何通過函數指針或函數對象,像許多STL功能要求。我不清楚如何結合繼承來使用它。

具體來說,我想打電話給一個STL函數與從基函子繼承幾個函子。我沒有發現任何有關此主題的言論或最佳做法。這裏的簡化的代碼片斷:

struct generator{ 
    virtual int operator()() = 0; 
    virtual ~generator(){}; 
}; 

struct A : public generator{ 
    int operator()(); 
}; 

struct B : public generator{ 
    int operator()(); 
}; 

int main() 
{ 
    auto v = std::vector<std::array<int, 500>>(2); 
    std::array<std::shared_ptr<generator>, 2> functors = {{std::make_shared<A>(), 
                 std::make_shared<B>()}}; 
    for (size_t i = 0; i < functors.size(); ++i) 
    std::generate(std::begin(v[i]), std::end(v[i]), 
        *(functors[i])); 
    return 0; 
} 

編譯此給出:

clang++ -std=c++11 -g -Wall -Wextra test_stackoverflow.cpp 
test_stackoverflow.cpp:25:5: error: no matching function for call to 'generate' 
    std::generate(std::begin(v[i]), std::end(v[i]),*(functors[i])); 
    ^~~~~~~~~~~~~ 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_algo.h:5003:5: note: candidate template ignored: substitution 
     failure [with _ForwardIterator = int *, _Generator = generator]: parameter type 'generator' is an abstract class 
    generate(_ForwardIterator __first, _ForwardIterator __last, 

是*的類型(仿函數[1])是發電機。這將不允許動態訪問A :: operator()和B :: operator()。我知道如何(rudmentally)解決這個問題。例如

std::generate(std::begin(v[i]), std::end(v[i], 
       [&]{ return functors[i]->operator()(); }; 

但是,這似乎相當模糊,我正在尋找一個更清晰的方式來實現我的目標。

怎樣一個通常通過這種動態仿函數。或者如果這是不被接受的,那麼最好的選擇是什麼?

任何幫助或建議者居多。

回答

1

的問題,因爲你可能已經知道,是由std::generate值變爲發電機。要傳遞一個多態對象,你必須通過引用傳遞。

而且有整整這種問題在C++的解決方案11(除了拉姆達選擇,這比我們的C++ 11之前,有更優雅,我相信)。解決方案是std::ref。它返回一個可以按值傳遞的引用包裝器。

這應該爲你工作:

std::generate(std::begin(v[i]), std::end(v[i]), 
       std::ref(*(functors[i]))); 

你之所以可以通過參考包裝作爲一個函子,是他們實現operator()

+0

另外'的std ::確認,可以function' – 2015-02-06 00:50:00

+0

將'std :: ref'傳遞給算法。不知道。 http://coliru.stacked-crooked.com/a/db815184c44240ad – 2015-02-06 00:50:19

+0

我會誠實的。我從來沒有聽說過std :: ref。非常感謝你的幫忙。你是否認爲lambda是優先考慮的,如果是的話,爲什麼? – APevar 2015-02-06 00:52:51