f
терпит неудачу, потому что компилятор не может определить, является ли передаваемый ему аргумент кортежа t
частью списка Args&&...
или является экземпляром const std::tuple<TupleArgs...>&
(который в данном случае является одиночным кортежем) который имеет тип variadi c).
f2
Первый аргумент на самом деле является единственным типом (кортеж), за которым следует пакет параметров c variadi *1018*, поэтому любой параметр, который Вы передаете после того, как первый параметр явно принадлежит Args&&...
. Обратите внимание, что я имею в виду параметры фактической функции, а не объявление шаблона. Прототипы функций - это то, что вызывает такое поведение.
Если вы хотите иметь два пакета параметров в списке параметров функции, то вы можете сделать несколько трюков, например поместить ОБА в кортежи или один в шаблоне. параметр шаблона (вложенные шаблоны).
Я включил два примера решения. Я изменил f
для использования двух кортежей и создал новую функцию f3
, которая использует параметр шаблона шаблона.
#include <tuple>
template<typename... Args, typename... TupleArgs>
void f(const std::tuple<Args...>&, const std::tuple<TupleArgs...>&)
{ }
template<typename... TArgs, template <typename...> class T, typename... TupleArgs>
void f3(T<TArgs...>&, const std::tuple<TupleArgs...>&)
{ }
template<typename... Args, typename... TupleArgs>
void f2(const std::tuple<TupleArgs...>&, Args&&...)
{ }
int main() {
auto t = std::make_tuple(1, 2, 2.0, 3.0f);
auto t2 = std::make_tuple(1, 2);
f( t2 , t ); // FIXED
f2(t, 1, 2); // Ok, no problem
f3(t2, t);
}