我是比較新的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()(); };
但是,這似乎相當模糊,我正在尋找一個更清晰的方式來實現我的目標。
怎樣一個通常通過這種動態仿函數。或者如果這是不被接受的,那麼最好的選擇是什麼?
任何幫助或建議者居多。
另外'的std ::確認,可以function' – 2015-02-06 00:50:00
將'std :: ref'傳遞給算法。不知道。 http://coliru.stacked-crooked.com/a/db815184c44240ad – 2015-02-06 00:50:19
我會誠實的。我從來沒有聽說過std :: ref。非常感謝你的幫忙。你是否認爲lambda是優先考慮的,如果是的話,爲什麼? – APevar 2015-02-06 00:52:51