Частично специализируем шаблон по первому параметру - PullRequest
1 голос
/ 04 апреля 2019

Сегодня я попытался сделать что-то, что с удивлением осознал, что это не сработало. У меня есть шаблон, который принимает тип и значение в качестве параметров. Я хочу специализироваться на параметре типа, но оставить параметр значения открытым. Вот так

template <class T = void, bool Enabled = false>
struct seFoo {};

template <bool Enabled>
struct seFoo<int, Enabled> {};

// Doesn't work :(
seFoo<false> foo;

Однако это приводит к ошибке компиляции для слишком небольшого числа аргументов шаблона. Похоже, что экземпляр должен соответствовать сигнатуре неспециализированного шаблона, прежде чем компилятор даже взглянет на частичную специализацию.

Есть ли способ заставить это работать?

Если такой подход принципиально невозможен, меня интересуют альтернативные подходы.

Видимо, я не единственный, кого это удивляет. Эта статья допускает ту же ошибку в конце.

1 Ответ

1 голос
/ 04 апреля 2019

Нет, вы не можете этого сделать.

Обратите внимание, что частичная специализация шаблона класса - это не то, что вы можете использовать напрямую любым способом. Его единственная функция заключается в том, что когда вы пытаетесь использовать основной шаблон как обычно, если частичная специализация соответствует параметрам вашего шаблона и является наилучшим соответствием среди любых других явных / частичных специализаций, то вместо частичной специализации основной шаблон для генерации определения этого конкретного типа класса.

В некоторых случаях есть вещи, которые вы можете сделать с аргументами шаблона по умолчанию, определение собственного значения для аргументов шаблона или другие подобные приемы. Но нет способа иметь один шаблон, который может принимать тип или значение в качестве первого аргумента шаблона, и у вас не может быть двух шаблонов классов или шаблонов псевдонимов с одинаковыми именами в одной и той же области видимости.

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