在其他的答案mentionned,如果tuple
包含一个以上的单int
std::get<int>(tuple)
将无法正常工作,所以它不会为你工作。
但是,你可以让你自己的get<>()
这是你想要的。以下代码定义了一个模板函数my_get<Et,P>(tuple)
,该函数将返回对tuple
的Et
类型的(P+1)th
元素的引用。
template<typename Et, size_t P, typename Ct, size_t N, typename Et2>
typename std::enable_if<std::is_same<Et,Et2>::value && (P == 0), Et&>::type
my_get(Ct& c, Et2& e) { return std::get<N>(c); }
template<typename Et, size_t P, typename Ct, size_t N, typename Et2>
typename std::enable_if<std::is_same<Et,Et2>::value && (P > 0), Et&>::type
my_get(Ct& c, Et2& e) { return my_get<Et,P-1,Ct,N+1>(c); }
template<typename Et, size_t P, typename Ct, size_t N, typename Et2>
typename std::enable_if<!std::is_same<Et,Et2>::value, Et&>::type
my_get(Ct& c, Et2& e) { return my_get<Et, P, Ct, N+1>(c, std::get<N+1>(c)); }
template<typename Et, size_t P, typename Ct, size_t N>
Et& my_get(Ct& c) { return my_get<Et, P, Ct, N>(c, std::get<N>(c)); }
template<typename Et, size_t P, typename Ct>
Et& my_get(Ct& c) { return my_get<Et, P, Ct, 0>(c); }
用法:
void tptest()
{
std::tuple<double,int,double,int> mytuple(1.0,2, 3.0, 4);
std::cout << "my_get<double,0>(mytuple) = " << my_get<double,0>(mytuple) << std::endl;
std::cout << "my_get<int,0>(mytuple) = " << my_get<int,0>(mytuple) << std::endl;
std::cout << "my_get<double,1>(mytuple) = " << my_get<double,1>(mytuple) << std::endl;
std::cout << "my_get<int,1>(mytuple) = " << my_get<int,1>(mytuple) << std::endl;
}
输出:
my_get<double,0>(mytuple) = 1
my_get<int,0>(mytuple) = 2
my_get<double,1>(mytuple) = 3
my_get<int,1>(mytuple) = 4
好像你可能只是一个命名的类最好避免头痛。 – TartanLlama
@TartanLlama是的。唯一的问题是这个元组在其他文件中定义,我无法更改... – Deqing
为什么你想要那个? – edmz