のような関数を書こうとしていますがstd::for_each
、通常の使用法に加えて、std::function<bool (param)>
. false の戻り値は、ループから抜け出したいことを意味します。以下のコードは、これまでに取得したものです。
2 番目の呼び出しa.visit([&](int) -> void)
は、!visitor(i) を評価するときにコンパイルされません。これを機能させることは可能ですか、それとも間違ったツリーを吠えていますか?
私は 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;
});
}