Как выполнить частичную специализацию шаблона с помощью пакета параметров и нетипичного значения шаблона? - PullRequest
3 голосов
/ 27 февраля 2020

При попытке использовать std :: array во время компиляции в шаблоне c * * * * * * * * * * *, я написал эту частичную специализацию шаблона:

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {}; //(2)

, что приводит к ошибке компиляции <Expression> has incomplete type and cannot be defined за мои попытки частичной специализации шаблона для Test1 и Test2, когда я пытаюсь его использовать; следовательно - насколько я понимаю - использование (3) не соответствует определению (2):

int main() {
  Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a; // (3)
}

Я не понимаю, почему это так. Экспериментируя с примером, я понимаю, что это происходит, когда я «скрываю» содержимое пакета параметров в моей any_type struct:

#include <array>

template <auto f> struct any_type;

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {};

template <typename array_wrapper> struct Test2;
template <int... A> struct Test2<any_type<std::get<0>(A...)>> {};

template <typename array_wrapper> struct Test3;
template <int A> struct Test3<any_type<A>> {};

int main() {
  //Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a;
  //Test2<any_type<1>> b;
  Test3<any_type<1>> ok;
}

Test1 и Test2 завершаются неудачно с той же ошибкой, а Test3 работает отлично. Почему частичная специализация шаблона «проваливается» в первых двух случаях? Насколько я понимаю, объявление предоставляет «интерфейс» для использования структуры, а аргументы в специализации сопоставляются с аргументами, которые фактически предоставляются.

Код Код можно найти здесь .

Параметры компиляции: Я использую g++-10.0 (GCC) 10.0.1 20200124 (experimental) и компилировать с помощью g++ -std=c++2a file.cc, c ++ 2a требуется, потому что я использую нетипичные параметры шаблона.

1 Ответ

1 голос
/ 27 февраля 2020

Существует конечный набор шаблонов, из которых могут быть выведены аргументы шаблона. Для шаблонных аргументов нетипичного типа это просто (из [temp.deduct.type] / 8 ):

  • type[i]
  • template-name<i> (где имя-шаблона относится к шаблону класса)
  • TT<i>

... и все. Ваш Test3 соответствует второй форме, а два других не совпадают вообще.

Непонятно, как пример Test2 будет работать вообще. Пример Test1 может быть тем, что мы хотим рассмотреть, так как использование нестандартных параметров шаблона распространяется после C ++ 20, но это просто не то, что в настоящее время действительно.

...