我有 类函数Find。该函数必须接受一些变量,有时(指向)另一个将在内部使用的函数。我该如何声明?
class CRoute
{
...
list<_T> Find(_T u1, _T u2, ????){
if (????) {...}
}
...
}
必须接受:
X.Find ( "Wien", "Berlin" );
X.Find ( "Wien", "Munchen", TrainFilterCompany ( set<string> { "CD", "DB" } ) );
X.Find ( "Wien", "Munchen", TrainFilterSpeed ( 120, 200 ) );
X.Find ( "Wien", "Munchen", [] ( const CTrain & x ) { return x . m_Company == "CD"; } );
(函数返回 bool 值)
(_T 在本例中是字符串)
最佳答案
您可以定义一个采用任何可调用对象的模板方法(它将支持带有捕获的 lambda 并传入对外部函数的引用):
template <typename Filter>
list<_T> Find(_T u1, _T u2, Filter filter) {
if (filter(obj)) ...
}
// Overload taking no filter and returning everything
list<_T> Find(_T u1, _T u2) {
return Find(u1, u2, [](const CTrain&) -> bool { return true; });
}
您还可以使用类似 std::function<bool (const CTrain&)>
的内容。当传入可调用对象时,这会产生轻微的动态分配开销,但如果 Find 方法特别复杂,则不会导致代码爆炸。
关于C++ 将函数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37082258/