【发布时间】:2011-04-12 19:21:47
【问题描述】:
目前,我有:
template <unsigned I,
unsigned N,
typename Tuple,
typename UnaryFunction>
struct for_;
template <unsigned N, typename Tuple, typename UnaryFunction>
struct for_<N, N, Tuple, UnaryFunction> {
static
void call(const Tuple&, UnaryFunction) {}
};
template <unsigned I,
unsigned N,
typename Tuple,
typename UnaryFunction>
struct for_ {
static
void call(Tuple&& x, UnaryFunction f) {
f(get<I>(x));
for_<I + 1, N, Tuple, UnaryFunction>::call(std::forward<Tuple>(x), f);
}
};
template <typename Tuple, typename UnaryFunction>
inline
void for_each(Tuple&& x, UnaryFunction f) {
for_<0,
tuple_size<
typename std::remove_const<
typename std::remove_reference<Tuple>::type
>::type
>::value,
Tuple,
UnaryFunction>::call(std::forward<Tuple>(x), f);
}
是否可以通过可变参数模板来概括这一点,以采用任意数量的元组参数?
编辑:
以下是我将如何使用我无法定义的内容:
if (i != e) {
std::array<Tuple, 2> x;
std::get<0>(x) = *i;
std::get<1>(x) = *i;
++i;
std::for_each (i, e, [&x](const Tuple& y) {
for_each(std::get<0>(x), y, assign_if(std::less));
for_each(std::get<1>(x), y, assign_if(std::greater));
});
}
编辑:改为使用右值引用和 std::forward
【问题讨论】:
-
这是如何工作的,考虑到元组是异构的,但每个元素只有一个
UnaryFunction重载? -
它要求元组是同质的——我使用元组来表示几何点(元组
)。 array 也可以工作(我相信它支持元组接口) - 重要的部分是编译时 get (与运行时迭代器相比)。这部分是为了在不影响编译时检查的情况下将用途推广到其他维度(array 等)。 -
我能够使用 map_each(UnaryFunction, Head&&, Tail&&...) 使其工作,并计划在必要的 24 小时后提交此文件,除非其他人可以提出使用 UnaryFunction 作为解决方案最终参数类型。
-
@ScootyPuff:仅供参考,§14.8.2.5/10 说函数参数包只能出现在参数声明列表的末尾。所以,如果你需要的是可变参数函数模板,
UnaryFunction可能无法成为最终参数。
标签: c++ c++11 variadic-functions variadic-templates