2016-11-14 2 views
2

Это должно быть очевидно, есть ли короткий синтаксис для получения подзаголовка?Извлечь несколько типов из кортежа

Нечто подобное:

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

'станд :: кортеж <станд :: строка, Int> subTuple {станд :: получить <0> (myTuple), станд :: получить <2> (myTuple)}; '? – CompuChip

+0

Что случилось с двумя? Я уверен, что вы можете сделать его более общим с некоторыми метатемами, но стоит ли это? – 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::tie (reference):

std::tuple<std::string, double, int> myTuple = ...; 
std::string a; 
int b; 
std::tie(a, std::ignore, b) = myTuple; 
Смежные вопросы