使用integer_sequence过滤元组

时间:2015-11-21 15:02:02

标签: c++ c++11 c++14

#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的来源,但它没有公开可变参数模板。

我想我必须使用专业化?我只是不确定如何接近它。

2 个答案:

答案 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);
}

DEMO

答案 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<>参数未命名,因此将优先选择它,并且仅使用其类型。