2013-05-17 2 views
10

У меня есть кортеж:прилагая значение в кортеж

std::tuple<int, std::string, bool> foo = { 10, "Hello, world!", false }; 

и я одну переменную некоторого типа:

MyClass bar; 

Как я должен идти о написании обобщенную функцию, которая добавляет к нему одно значение (или даже несколько значений, если возможно) в новый кортеж?

std::tuple<int, std::string, bool, MyClass> fooBar = tuple_append(foo, bar); 
                ^^^^^^^^^^^^ 
              // I need this magical function! 
+10

Разве вы не можете просто использовать [ 'tuple_cat'] (http://en.cppreference.com/w/cpp/утилиты/кортеж/tuple_cat)? – Zeta

+0

Не существует C++ 0x, вы также можете использовать C++ 11. Изменение названия. – paxdiablo

+0

@paxdiablo В C++ pre-11 нет 'tuple', поэтому мы можем также удалить теги из названий;) –

ответ

15

Использование std::tuple_cat (как уже комментировали Zeta):

#include <iostream> 
#include <string> 
#include <tuple> 

int main() 
{ 
    std::tuple<int, std::string, bool> foo { 10, "Hello, world!", false }; 

    auto foo_ext = std::tuple_cat(foo, std::make_tuple('a')); 

    std::cout << std::get<0>(foo_ext) << "\n" 
       << std::get<1>(foo_ext) << "\n" 
       << std::get<2>(foo_ext) << "\n" 
       << std::get<3>(foo_ext) << "\n"; 
} 

Выход:

 
10 
Hello, world! 
0 
a 

См http://ideone.com/dMLqOu.

5

Для добавления одного элемента, это будет работать:

template <typename NewElem, typename... TupleElem> 
std::tuple<TupleElem..., NewElem> tuple_append(const std::tuple<TupleElem...> &tup, const NewElem &el) { 
    return std::tuple_cat(tup, std::make_tuple(el)); 
} 

Live example

Смежные вопросы