2008-09-17 1 views
2

В C++ 0x Я хотел бы написать такую ​​функцию:В C++ у вас есть функция, которая модифицирует кортеж переменной длины?

template <typename... Types> 
void fun(typename std::tuple<Types...> my_tuple) { 
    //Put things into the tuple 
} 

Я первый попытался использовать цикл на int i, а затем сделать:

get<i>(my_tuple); 

А затем хранить некоторое значение в результате. Однако get работает только с constexpr.

Если бы я мог получить переменные из tuple и передать их в вариационную шаблонную функцию, я мог бы очень легко переписать аргументы, но я не знаю, как получить переменные из кортежа без get. Любые идеи о том, как это сделать? Или у кого-нибудь есть другой способ изменения этого tuple?

ответ

4

Поскольку «Я» в

get<i>(tup) 

должны быть постоянная во время компиляции, шаблон экземпляр используется для «итерации» (на самом деле рекурсия) через значение. Корзины для увеличения имеют мета-функции «длина» и «элемент», которые могут быть полезны здесь - я полагаю, что у C++ 0x есть и эти.

+0

Thanks! Мой код теперь выглядит так: template void fun (typename std :: tuple my_tuple) { get (my_tuple); fun (my_tuple); } – 2008-09-21 17:55:40

3

Boost.Fusion стоит посмотреть. Он может «перебирать» по std::pair, boost::tuple, некоторые другие контейнеры и его собственные типы кортежей, хотя я не думаю, что он поддерживает std::tuple.

0

Посмотрите на разделе 6.1.3.4 из TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

прибудет определяются как для константных и неконстантных квалифицированных кортежей и возвращают соответствующий тип ссылки. Если вы измените свое объявление функции на следующее:

template 
void fun(typename std::tuple& my_tuple) { 
    //Put things into the tuple 
}

Тогда аргумент вашей функции является неконстантной кортеж и получить позволит вам сделать необходимые назначения, как только вы написали итерации, используя информацию, представленную в предыдущих ответах.

0

AFAICT, C++ кортежи в основном должны обрабатываться с рекурсией; там, похоже, не существует реальных способов упаковки/распаковки кортежей , кроме, используя только обработку вариационных шаблонов системы.

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