Вычет аргумента шаблона для шаблонов классов и пакетов с несколькими параметрами

#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. Итак, ответ — нет, это не будет разрешено , верно?