Функция 'Процесс' принимает переменное число аргументов типа переменной . Для обработки разных случаев я успешно перегрузил его следующим образом:
// general case
template <typename ...Types>
void Process( const Types&... items )
// single T
template <typename T>
void Process( const T& t )
// one or more of type NVP<>
template <typename T1, typename ...Types>
void Process( const NVP<T1>& nvp1, const NVP<Types>&... nvps )
Что я хочу сделать - но не могу - это следующее : мне нужна перегрузка для случаев с любое количество ведущих аргументов типов ATT<>
, за которыми следует любое число NVP<>
, например:
// any number of leading Types ATT<> followed by any number of NVP<>
template <typename ...ATypes, typename ...BTypes>
void Process( const ATT<ATypes>&... atts, const NVP<BTypes>&... nvps )
Сначала вы можете подумать, что компилятору должно быть «легко» соответствовать этому, если это может уже делать другие случаи. Здесь не должно быть абсолютно никакой двусмысленности !? Однако сопоставление завершается неудачно, сообщений об ошибках нет, но требуемая перегрузка просто игнорируется компилятором.
В настоящее время используется VS2017 с / std: c ++ 17
Примечания:
1. Очевидно, что это можно сделать для один начальный тип ATT<T1>
вот так
// one leading Type ATT<T1>
template <typename T1, typename ...Types>
void Process( const ATT<T1>& a1, const Types&... remaining )
Но для более чем одного Мне нужно сделать некрасивую ручную рекурсию. Я действительно хочу, чтобы весь пакет ведущих составлял ATT<...>
.
2. Я знаю, что ведущий пакет параметров - общих типов - всегда неоднозначен для сопоставления, но для специализации типа ATT<ATypes>...
двусмысленности быть не должно.