Каков синтаксис для частичной специализации аргумента пакета параметров для типа void? - PullRequest
0 голосов
/ 22 ноября 2018

Я не могу найти способ заставить это работать.Это вообще возможно?Я не понимаю, почему это не так.

template <auto id, typename FirstField, typename... OtherFields>
struct FieldTypeById {
    using Type = int;
};

template <auto id>
struct FieldTypeById<id, void> {
    using Type = void;
};


int main()
{
   using t1 = FieldTypeById<0, int>::Type;
   using t2 = FieldTypeById<1>::Type;

    return 0;
}

https://godbolt.org/z/AggnDq

1 Ответ

0 голосов
/ 22 ноября 2018

Проблема в вашем примере не в специализации, это нормально.Проблема в том, что FieldTypeById<1> не может вывести тип FirstField.Вы можете изменить это, просто добавив значение по умолчанию к основному шаблону:

template <auto id, typename FirstField = void, typename... OtherFields>
struct FieldTypeById {
    using Type = int;
};

Теперь все аргументы даны явно, взяты из значений по умолчанию или выведены (как пустой пакет).После того, как все аргументы известны, можно использовать специализацию для этих аргументов.

Посмотреть вживую

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...