2
這是可能的遍歷一個元組的元素和應用功能與此類型的實現:遍歷元組的元素在指定的順序
#include <tuple>
#include <utility>
template<class... Args>
void swallow(Args&&...)
{
}
template<size_t... Indices, class Function, class Tuple>
void tuple_for_each_in_unspecified_order_impl(std::index_sequence<Indices...>, Function f, const Tuple& t)
{
swallow(f(std::get<Indices>(t))...);
}
template<class Function, class... Types>
void tuple_for_each_in_unspecified_order(Function f, const std::tuple<Types...>& t)
{
tuple_for_each_in_unspecified_order_impl(std::index_sequence_for<Types...>(), f, t);
}
由於這種實現依賴的傳遞給swallow()
參數的順序功能,f
的調用順序未指定。給力的f
的調用與元組元素的順序同意
的一種方法是使用遞歸:
template<class Function, class Tuple>
void tuple_for_each_in_order_impl(std::index_sequence<>, Function f, const Tuple& t) {}
template<size_t I, size_t... Indices, class Function, class Tuple>
void tuple_for_each_in_order_impl(std::index_sequence<I,Indices...>, Function f, const Tuple& t)
{
f(std::get<I>(t));
tuple_for_each_in_order_impl(std::index_sequence<Indices...>(), f, t);
}
template<class Function, class... Types>
void tuple_for_each_in_order(Function f, const std::tuple<Types...>& t)
{
tuple_for_each_in_order_impl(std::index_sequence_for<Types...>, f, t);
}
這個遞歸解決方案的問題是,它可能會引入令人失望的編譯時的性能。
是否有更高效的解決方案來生成期望的評估訂單?我知道許多用於元編程和元組操作的精細C++庫都是可用的,但我對如果存在解決方案的實現細節感興趣。
可以解壓到一個支撐init列表,它將保留評估順序 - http://coliru.stacked-crooked.com/a/dd7b84d60396b38a – 0x499602D2
這篇博客文章應該完美地解釋一切:http://florianjw.de/en/variadic_templates.html –