【发布时间】:2016-01-22 20:30:50
【问题描述】:
可以遍历元组的元素并通过这种实现应用函数:
#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++ 库可用,但我对解决方案的实现细节感兴趣,如果存在的话。
【问题讨论】:
-
您可以解压到一个带括号的初始化列表中,这将保留评估顺序 - coliru.stacked-crooked.com/a/dd7b84d60396b38a
-
这篇博文应该能完美解释一切:florianjw.de/en/variadic_templates.html
标签: c++ tuples metaprogramming operator-precedence