如何在新元组中提取元组的子集?

时间:2017-01-02 03:12:20

标签: c++

我有一个包含变量类型元组的类,例如:

template<class... Ts>
struct Tester
{
    std::tuple<Ts...> t;

    template<class... T2s>
    std::tuple<T2s...> Get() { ??? }
};

示例实例是Tester<int, float, char>

我希望我的Get函数只返回内部元组的子集。例如,tester.Get<int, char>将返回std::tuple<int, char>,其值将从内部元组的相应成员中复制。

您可以假设每个类型在元组中最多出现一次,Get只会使用元组中的合理模板参数调用。

1 个答案:

答案 0 :(得分:8)

实际上,这比你想象的要容易。 std::get接受一个类型,作为元组成员索引的替代(从C ++ 14开始),并从元组返回第一个匹配类型:

#include <tuple>
#include <iostream>
#include <type_traits>

template<class... Ts>
struct Tester
{
    std::tuple<Ts...> t;

    template<class... T2s>
    std::tuple<T2s...> Get() {
        return std::tuple<T2s...> {std::get<T2s>(t)...};
    }
};


int main()
{
    Tester<int, char, float> t;

    t.t=std::make_tuple(0,1,2);

    auto result=t.Get<int, float>();

    std::cout <<
        std::is_same<decltype(result), std::tuple<int, float>>::value
          << std::endl;

    int &i=std::get<0>(result);
    float &f=std::get<1>(result);

    std::cout << i << " " << f << std::endl;
    return 0;
}

输出,用gcc 6.3.1测试:

1
0 2