#c #templates #variadic-templates #c 17
#c #шаблоны #переменные-шаблоны #c 17
Вопрос:
В C 17 аргументов шаблона для шаблона класса будут выведены более или менее так, как это происходит в настоящее время для шаблона функции.
Вот соответствующий документ.
В качестве примера из вышеупомянутой статьи:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
Шаблоны функций имеют еще одну интересную особенность, когда происходит вычитание.
Рассмотрим следующий код:
template<typename... U, typename... T>
auto func(Tamp;amp;...) {}
// ...
// U is int, char - T is int, double
func<int, char>(0, .0);
У нас может быть два пакета параметров, если вычет помогает различать их.
Нет необходимости заключать их в кортеж или какую-либо другую структуру.
Можно ли будет сделать то же самое с шаблонами классов?
В качестве примера:
template<typename... U, typename... T>
struct S {
S(Tamp;amp;...) {}
};
// ...
// U is int, char - T is int, double
S<int, char> s{0, .0};
В документе приведен приведенный ниже пример:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
В любом случае, это не совсем одно и то же, и я не уверен, будет ли это разрешено или нет.
Ответ №1:
Это:
template<typename... U, typename... T>
struct S { ... };
просто неправильно сформирован для [temp.param]:
Если шаблон-параметр шаблона основного класса, шаблона основной переменной или шаблона псевдонима является пакетом параметров шаблона, он должен быть последним шаблоном-параметром.
Этот случай:
template<class ... Ts> struct X { X(Ts...) };
X<int> x3{1, 'a', "bc"}; // OK X<int,char,const char*>
проблематично, поскольку X<int>
это уже допустимый тип. Эта часть статьи была удалена в Оулу, хотя, возможно, какое-то предложение в будущем позволит указать, что некоторые параметры шаблона класса должны быть выведены, но другие должны быть указаны:
X<string, ???> x3{"a", 1, "b"}; // X<string, int, const char*>.
где ???
находится некоторая серия токенов, которая проясняет намерение.
Комментарии:
1. Итак, ответ — нет, это не будет разрешено , верно?