我有一个包含变量类型元组的类,如下所示:
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/