我有一个包含变量类型元组的类,例如:
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
只会使用元组中的合理模板参数调用。
答案 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