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

标签 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只会使用元组中合理的模板参数调用。

最佳答案

实际上,这比您想象的要容易。 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

关于c++ - 如何在新元组中提取元组的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420968/

相关文章:

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

c++ - 我正在尝试创建一个使用C++中的参数包构造函数的异常类

python - Cython 中动态大小的对象数组

c++ - 修改传递给函数的指针时出现 Visual Studio C++ 访问冲突

c++ - 将仿函数保留为变量

C++时间序列库(分析处理)

c++ - apache httpd 模块的共享内存权限被拒绝错误

c++ - 如何将现有的分布式服务应用移植到DCOS?

c++ - 外部链接会增加链接/构建时间吗?

C++11 Mersenne Twister 每次都产生相同的值