2016-11-14 70 views
2

這應該是顯而易見的,是否有一些簡短的語法來獲取子傀儡?從元組中提取多個類型

類似的東西:

std::tuple<std::string, double, int> myTuple; 
std::tuple<std::string, int> subTuple = std::get<std::string, int>(myTuple); 
+0

'的std ::元組<的std :: string,int>的子元組{的std ::得到<0>(myTuple)的std ::得到<2>(myTuple)}; '? – CompuChip

+0

兩個得到什麼錯誤?我敢肯定,你可以用一些metatemplate欺騙來使它更通用,但這是否值得? – rubenvb

+0

@rubenvb,我以爲std庫有。 – Velkan

回答

4

你需要讓自己的模板功能,這在下面的實施需要C++ 14(因爲它需要std::get<T>,可以實現在C++ 11自己):

template<typename... R, typename ...Args> 
std::tuple<R...> sub_tuple(const std::tuple<Args...>& original) { 
    return std::make_tuple(std::get<R>(original)...); 
} 

int main() 
{ 
    std::tuple<std::string, double, int> myTuple = std::make_tuple("Hello", 1201.0, 51); 
    std::tuple<std::string, int> subTuple = sub_tuple<std::string, int>(myTuple); 
    std::cout << std::get<0>(subTuple) << "   " << std::get<1>(subTuple); 
} 

注:這將在原來的元組爲每個元素的副本

0

您可以使用std::tiereference):

std::tuple<std::string, double, int> myTuple = ...; 
std::string a; 
int b; 
std::tie(a, std::ignore, b) = myTuple;