使用integer_sequence过滤元组

Mai*_*ein 5 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);
}
Run Code Online (Sandbox Code Playgroud)

这可行,但我想知道如何将integer_sequence传递给map_filter_tuple

auto t3 = map_filter_tuple<std::integer_sequence<size_t,0,1,2>>(times2,t);
Run Code Online (Sandbox Code Playgroud)

我查看了源代码integer_sequence,它没有公开可变参数模板。

我想我必须使用专业化?我只是不确定我会如何处理它。

Pio*_*cki 4

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);
}
Run Code Online (Sandbox Code Playgroud)

演示版