В C ++, вы можете иметь функцию, которая изменяет кортеж переменной длины? - PullRequest
2 голосов
/ 17 сентября 2008

В C ++ 0x я хотел бы написать такую ​​функцию:

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

Сначала я попытался использовать цикл for на int i, а затем выполнить:

get<i>(my_tuple);

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

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

Ответы [ 5 ]

4 голосов
/ 17 сентября 2008

С "я" в

get<i>(tup)

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

3 голосов
/ 17 сентября 2008

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

0 голосов
/ 23 октября 2009

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

Как развернуть кортеж в аргументы функции-шаблона?

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

Взгляните на раздел 6.1.3.4 TR1, http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2005 / n1836.pdf

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...