Kann ich hier eine Vorlagenrekursion vermeiden?
Ich habe ein @ geschriebfor_each
zumtuple
s:
template <typename Tuple, typename F, size_t begin, size_t end>
enable_if_t<begin == end || tuple_size<Tuple>::value < end> for_each(Tuple&, F&&) {
}
template <typename Tuple, typename F, size_t begin = 0U, size_t end = tuple_size<Tuple>::value>
enable_if_t<begin < end && tuple_size<Tuple>::value >= end> for_each(Tuple& t, F&& f) {
f(get<begin>(t));
for_each<Tuple, F, begin + 1, end>(t, forward<F>(f));
}
Aber Yakks Antwort auf diese Frage gibt ein wunderbares Beispiel dafür, wie man mit Lambda auf allen läufttuple
values nicht rekursiv:
namespace detail {
template<class F, class...Args>
void for_each_arg(F&& f, Args&&...args) {
using detail = int[];
static_cast<void>(detail{((f(std::forward<Args>(args))), void(), 0)..., 0});
}
}
template <typename F, typename Tuple>
void for_each_tuple_element(F&& f, Tuple&& t) {
return experimental::apply([&](auto&&...args) { detail::for_each_arg(forward<F>(f), decltype(args)(args)... ); }, forward<Tuple>(t));
}
Dies erfordertapply
. Sie können meine Vereinfachung von @ seh Yakkntwort von @ hier:http: //ideone.com/yAYjm
Meine Frage lautet:ibt es eine Möglichkeit, irgendwie nachzurüstefor_each_tuple_element
mit einem Bereich, der die Rekursion meines Codes vermeidet? Ich habe versucht, die Teilmenge des @ zu konstruiertuple
definiert durch den Bereich, aber ich scheine das nicht zu tun, ohne eine Rekursion zu verwenden, und warum dann nicht einfach meinfor_each
?