我正在尝试编写一个类似的函数std::for_each
,除了正常使用外,还可以带一个std::function<bool (param)>
. 错误的返回值意味着我想跳出循环。下面的代码是我到目前为止所得到的。
评估 !visitor(i) 时,第二次调用a.visit([&](int) -> void)
不会编译。是否有可能完成这项工作,还是我在吠叫错误的树?
我正在使用 MSVC 2010,但希望代码通常与 C++11 兼容。
#include <list>
#include <string>
#include <iostream>
struct A
{
std::list<int> _lst;
template<typename _F>
void visit(_F visitor)
{
for(std::list<int>::const_iterator it = _lst.begin(), end = _lst.end() ; it != end ; it++) {
int i = *it;
if (std::is_void<decltype(visitor(i))>::value) {
visitor(i);
} else {
if (!visitor(i)) { // <----- error C2171: '!' : illegal on operands of type 'void'
break;
}
}
}
}
};
int main(int argc, char* argv[])
{
A a;
// populate a
for (int i = 0 ; i < 10 ; i++) {
a._lst.push_back(i);
}
a.visit([](int i) -> bool {
std::cout << i << std::endl;
return i < 5;
});
a.visit([](int i) {
std::cout << i << std::endl;
});
}