Можно ли в C++ создать функцию, изменяющую кортеж переменной длины?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

Вопрос

В 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?

Это было полезно?

Решение

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

get<i>(tup)

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

Другие советы

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

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

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

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

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

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

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

Как расширить кортеж до аргументов функции шаблона с переменным числом аргументов?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top