Можно ли в C++ создать функцию, изменяющую кортеж переменной длины?
Вопрос
В 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 позволит вам выполнить необходимые присваивания после того, как вы напишете итерацию, используя информацию, предоставленную в предыдущих ответах.
Посмотрите мой ответ здесь, чтобы увидеть пример рекурсии шаблона для преобразования аргументов кортежа в вызов функции.
Как расширить кортеж до аргументов функции шаблона с переменным числом аргументов?