Так что я пытаюсь выяснить, как это работает: C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?Распаковка аргументы из кортежей
Кусок черной магии я не понимаю этот фрагмент кода:
f(std::get<N>(std::forward<Tuple>(t))...)
это выражение в f
что я не понимаю.
Я понимаю, что выражение каким-то образом распаковывает/расширяет то, что находится внутри t
, в список аргументов. Но может ли кто-то объяснить, как это делается? Когда я смотрю на определение std::get
(http://en.cppreference.com/w/cpp/utility/tuple/get), я не вижу, как N
подходит ...? Насколько я могу судить, N - последовательность целых чисел.
Основываясь на том, что я могу наблюдать, я предполагаю, что выражения в форме E<X>...
, где X
- это последовательность типов X1
. X2
, ... Xn
, выражение будет расширено как E<X1>, E<X2> ... E<Xn>
. Так ли это работает?
Редактировать: В этом случае N не является последовательностью типов, а целыми числами. Но я предполагаю, что эта языковая конструкция применяется к обоим типам и значениям.
Да, да, да и да. Он в основном расширяется до 'get <0> (t), get <1> (t), get <2> (t), ..., get (t)' –
Xeo
*** БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ ***: никогда не используйте 'std: : forward' или 'std :: move' в расширении пакета аргументов - значение (здесь кортеж' t') разрешается только перемещать ** один раз **. Он может работать здесь, потому что 'std :: get' на самом деле не перемещается, но это само по себе является ** анти-шаблоном **, который должен быть в состоянии определить, а затем исправить! –
@ Daniel: 'std :: forward' здесь отлично, так как он извлекает только элементы кортежа и, таким образом, только перемещает их. Если вы знаете, что делаете, я не вижу проблемы, и я не думаю, что это анти-шаблон, как вы это делаете. – Xeo