Я пытаюсь создать перегрузку оператора типа bash для лямбда-функций, в которой вы передаете вектор и в лямбду, которая фильтрует или печатает вектор
Я пытался использовать auto сdecltype, попытался поместить их все в одну и ту же функцию, надеясь, что auto будет знать, когда возвращать void и когда возвращать вектор, но все, что я пытаюсь, либо не компилируется, либо говорит о неоднозначной перегрузке.
Вот код,
#include <iostream>
#include <algorithm>
#include <functional>
#include <type_traits>
using namespace std;
void operator | ( auto& v, auto map ) {
for( auto x : v )
map( x );
}
template <typename T>
T operator | ( T& vet, auto map) {
cout << "else" << endl;
T aux;
for ( auto x : vet)
aux.push_back(x);
return aux;
}
int main () {
vector<int> v{1,2,3,4,5,6,7,8} ;
v | []( int x ) { return x % 2 == 0; } | [] ( int x ) { cout << x << endl; };
v | [] ( int x ) { cout << x << endl; };
return 0;
}
Вот что происходит:
trabapply3.cc:25:6: error: ambiguous overload for ‘operator|’ (operand types are ‘std::vector<int>’ and ‘main()::<lambda(int)>’)
25 | v | [] ( int x ) { cout << x << endl; };
Любые советы?