Я пытаюсь развернуть пакет параметров путем рекурсивной отправки в класс. Я хотел бы сделать это справа налево, поскольку некоторые операции выполняются заранее.
template <typename... T>
class Foo;
template <typename T>
class Foo<T> {/* base case implementation*/};
template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R> {
private:
Foo<T, Rs...> foo_;
}
К сожалению, вышесказанное достает меня:
class template partial specialization contains template parameters that cannot be deduced;
this partial specialization will never be used
Это кажется мне странным, я бы предположил, что даже если аргументы изменили порядок, Foo<T, Rs..., R>
все равно должен соответствовать специализации шаблона.
Я посмотрел на несколько похожих вопросов:
В частности, Частичная специализация шаблона C ++: Почему я не могу сопоставить последний тип в variadic-template?
Однако, ответ с наибольшим количеством голосов (не принят) не имеет смысла для меня. Конечно, я понимаю, что объявление пакета параметров шаблона должно быть последним в объявлении, но я делаю это для специализации шаблона.
Я не уверен, почему компилятор не может сопоставить Foo<T, Rs..., R>
с исходным объявлением шаблона Foo<T...>
и применяет там порядок объявления пакета параметров.
Другие ответы в этом потоке предлагают, как извлечь последнее значение, но это по-прежнему не позволяет вам выполнить рекурсивную развертку пакета параметров, что в этом вся суть. Разве невозможно развернуть пакет параметров справа налево?