在其他的答案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