2013-05-17 30 views
10

Tôi có một tuple:Phụ thêm một giá trị cho một tuple

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

và tôi có một biến duy nhất của một số loại:

MyClass bar; 

Làm thế nào tôi nên đi về cách viết một hàm tổng quát mà gắn thêm một giá trị đơn (hoặc thậm chí nhiều giá trị, nếu có thể) thành một bộ dữ liệu mới?

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

Có thể bạn không chỉ đơn giản là sử dụng [ 'tuple_cat'] (http://en.cppreference.com/w/cpp/utility/tuple/tuple_cat)? – Zeta

+0

Không có C++ 0x nữa, bạn cũng có thể sử dụng C++ 11. Thay đổi tiêu đề. – paxdiablo

+0

@paxdiablo Không có 'tuple' trong C++ pre-11 anyway, vì vậy chúng tôi cũng có thể xóa thẻ khỏi tiêu đề;) –

Trả lời

15

Sử dụng std::tuple_cat (như đã nhận xét bởi 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"; 
} 

Output:

 
10 
Hello, world! 
0 
a 

Xem http://ideone.com/dMLqOu.

5

Đối với phụ thêm một yếu tố duy nhất, điều này sẽ làm việc:

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

Các vấn đề liên quan