Есть ли способ создать шаблонную функцию, в которой имеется одинаковое количество параметров шаблона и параметров функции (одного и того же типа)?
Да: это так (Редактировать:упрощено по предложению Джастина; спасибо!)
#include <string>
template <typename, typename T>
using skip_first = T;
template <typename ... Args>
void foo (skip_first<Args, std::string> ... as)
{ }
int main()
{
foo<int>("one argument only");
foo<int, double>("first argument", "second argument");
}
Что если есть параметр функции по умолчанию (или несколько)?
template<typename ... Args>
void foo(int i /* as default */, const std::string& a,
const std::string& b, ...)
{ /*...*/}
Если вы хотите один(или более) предшествующий параметр (и) другого (их) типа (ов), да, это возможно.
template <typename ... Args>
void foo (int i, long j, skip_first<Args, std::string> ... as)
{ }
Если вы хотите, чтобы предыдущий параметр имел значение по умолчанию, no: невозможно, поскольку список переменныхПараметр не может иметь значение по умолчанию, и, поскольку данный параметр имеет значение по умолчанию, все следующие параметры должны иметь параметр по умолчанию.
Возможно ли даже иметь, скажем, дубликат числааргументов функции (рассчитывается по размеру параметров шаблона)?
Я полагаю, вы можете умножить (повторить распаковку несколько раз) часть распаковки
template <typename ... Args>
void foo (skip_first<Args, std::string> ... as1,
skip_first<Args, std::string> ... as2)
{ }
Очевидно, это решениеработает только если вы хотите умножить число аргументов шаблона на целое число.