Próbuję napisać funkcję podobną do std::for_each
, która oprócz zwykłego użycia może również przyjąć wartość std::function<bool (param)>
. Wartość false return oznacza, że chcę wyjść z pętli. Poniższy kod jest tym, co dostałem do tej pory.Parametr lambda z opcjonalną wartością zwracaną
Drugie połączenie z a.visit([&](int) -> void)
nie kompiluje podczas oceniania! Odwiedzającego (i). Czy można wykonać tę pracę, czy też szczerzę złe drzewo?
Używam MSVC 2010, ale chcę, aby kod był ogólnie zgodny z 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;
});
}
Kod po obu stronach oddziału if musi być poprawny i możliwy do kompilacji, więc nie można wybrać na podstawie std :: is_void wewnątrz treści funkcji. – goji
Dlaczego używasz nazw zaczynających się od podkreślenia i dużej litery, takich jak '_F'? –
To jest konwencja, której używam dla parametrów szablonu. Myślę, że podniosłem to, patrząc na kod STL. – kylewm