#include <tuple>
#include <utility>
using namespace std;
template <size_t... Indices, class F, class T>
auto map_filter_tuple(F f, T &t) {
return make_tuple(f(std::get<Indices>(t))...);
}
int main()
{
auto times2 = [](auto i) { return i * 2; };
auto t = make_tuple(1, 2, 3, 4);
auto t2 = map_filter_tuple<0, 1, 2>(times2, t);
}
这有效,但我想知道如何将integer_sequence传递给map_filter_tuple
auto t3 = map_filter_tuple<std::integer_sequence<size_t,0,1,2>>(times2,t);
我查看了integer_sequence
的来源,但它没有公开可变参数模板。
我想我必须使用专业化?我只是不确定如何接近它。
答案 0 :(得分:3)
template <std::size_t... Is, typename F, typename T>
auto map_filter_tuple(F f, T& t)
{
return std::make_tuple(f(std::get<Is>(t))...);
}
template <std::size_t... Is, typename F, typename T>
auto map_filter_tuple(std::index_sequence<Is...>, F f, T& t)
{
return std::make_tuple(f(std::get<Is>(t))...);
}
template <typename S, typename F, typename T>
auto map_filter_tuple(F&& f, T& t)
{
return map_filter_tuple(S{}, std::forward<F>(f), t);
}
答案 1 :(得分:1)
解决方案已经存在。您可以传入索引序列来推断索引:
template <size_t ...Indices, class F, class T>
auto map_filter_tuple(F f,T &t, std::index_sequence<Indices...>)
{// ^^^^^^^^^^^^^^^^^^^^
return make_tuple(f(std::get<Indices>(t))...);
}
代码在 Demo 中展示,我们只使用初始元组的一部分。此外,std::index_sequence<>
参数未命名,因此将优先选择它,并且仅使用其类型。