2016-01-22 32 views
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++庫都是可用的,但我對如果存在解決方案的實現細節感興趣。

+2

可以解壓到一個支撐init列表,它將保留評估順序 - http://coliru.stacked-crooked.com/a/dd7b84d60396b38a – 0x499602D2

+1

這篇博客文章應該完美地解釋一切:http://florianjw.de/en/variadic_templates.html –

回答

3

在C++ 1Z,摺疊起來的逗號操作:

(... , void(f(get<Indices>(t)))); 

在此之前,解壓到一個支撐,初始化列表,如:

auto l = {0, (void(f(get<Indices>(t))), 0)... }; 
(void) l;