Равное количество параметров шаблона и функции - PullRequest
0 голосов
/ 10 июня 2018

Есть ли способ сгенерировать шаблонную функцию, в которой имеется одинаковое количество параметров шаблона и параметров функции (одного типа)?

Например:

// template function:
template<typename ... Args>
void foo(const std::string& a, const std::string& b, ...) { /*...*/}

// example 1
foo<int>("one argument only");

// example 2
foo<int, double>("first argument", "second argument");

Что если есть параметр функции по умолчанию (не шаблонный) (или несколько), который всегда существует?

template<typename ... Args>
void foo(int i /* as default */, const std::string& a,
                                 const std::string& b, ...)
 { /*...*/}

Возможно ли даже иметь, скажем, дублирующееся число аргументов функции (рассчитанное по размеру параметров шаблона)?

1 Ответ

0 голосов
/ 10 июня 2018

Есть ли способ создать шаблонную функцию, в которой имеется одинаковое количество параметров шаблона и параметров функции (одного и того же типа)?

Да: это так (Редактировать:упрощено по предложению Джастина; спасибо!)

#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)
 { }

Очевидно, это решениеработает только если вы хотите умножить число аргументов шаблона на целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...