Jak wspomniano w komentarzach naprawdę nie można to zrobić jak lambda nie są wystarczająco silne.
Po wprowadzeniu składnibędzie to znacznie łatwiejsze.
używam następujących do podstawowego powołania przez krotki .:
template<typename Tuple_t, typename Func_t, std::size_t k_index = 0>
//Only come here if the passed in index is less than sie of tuple
typename std::enable_if<k_index < tuple_size<Tuple_t>::value>::type
call_over_tuple(Tuple_t& irk_tuple, Func_t i_func){
i_func(get<k_index>(irk_tuple));
call_over_tuple<Tuple_t, Func_t, k_index + 1>(irk_tuple, i_func);
}
template<typename Tuple_t, typename Func_t, std::size_t k_index>
typename std::enable_if <k_index>= tuple_size<Tuple_t>::value>::type
call_over_tuple(Tuple_t& irk_tuple, Func_t i_func){
//do nothing
}
Rozszerzenie to tylko przypadkowe args daje.
template<typename Func_t, typename ...Args>
void call_over_vals(Func_t i_func, Args&&... i_args){
auto arg_tuple = make_tuple(forward<Args>(i_args)...);
call_over_tuple<decltype(arg_tuple), Func_t>(arg_tuple, i_func);
}
Aby mieć przeciążenie funkcji lub szablony, musisz utworzyć klasę dzwoniącego, która licytuje.
template<typename T>
void do_something(const T& irk_val){
cout << irk_val;
}
class caller_class{
public:
template<typename T>
void operator()(const T& i_val){
do_something(i_val);
}
private:
};
void print_integer(int i_val){
cout << i_val;
}
int main(int argv, char** argc){
call_over_vals(caller_class(), 3, ' ' , 2, " asdf ", 4, "\n");
//If you know the argument type just pass it in
call_over_vals(print_integer, 1, 2, 3, 4, 5);
cout << "\n";
call_over_vals([](int y_val){cout << y_val; }, 1, 2, 3, 4, 5);
}
wyjściowa:
3 2 asdf 4
12345
12345
myślę C++ 14 pozwala to zrobić: http://coliru.stacked-crooked.com/a/386d6f281077b336 – chris
Jak go użyć? Wygląda trochę jak szablon zmienny (który nie jest dozwolony w zakresie bloku w C++ 1y). Jako polimorficzna lambda, patrz rozwiązanie Chrisa. W C++ 11 można to zaimplementować jako pełnowartościową klasę obiektów funkcji. – dyp
Występują problemy z pseudorekursywnym wywołaniem 'foo': identyfikator może nie pojawić się w inicjalizatorze dla deklaracji z' auto'. (Nie możesz też przeciążać lambd, ale myślę, że to część pytania.) – dyp