Я понимаю, что обычные средства в С++ для контроля во время компиляции того, какие функции-члены шаблона класса включаются/исключаются, осуществляются посредством частичной специализации. У меня есть шаблон класса, который имеет параметр типа и параметр, не являющийся типом, в зависимости от параметра типа. Когда параметр нетипа имеет определенное значение, я хочу, чтобы определенные функции-члены шаблона класса были частью создания экземпляра шаблона класса, но не другие. Обычный способ сделать это — закодировать основной шаблон, включив в него определенные функции-члены, а затем закодировать частичную специализацию основного шаблона с другим набором функций-членов. Но из-за правила, которое гласит:
Аргумент шаблона, не являющийся типом, не может специализировать параметр шаблона, тип которого зависит от параметра специализации. Я не могу этого сделать. Это можно обойти ? Простой пример кода будет выглядеть так:
template
<
class T,
T * v
>
struct AClassTemple
{
void SomeMemberFunction() { code etc. }
void AnotherMemberFunction() { code etc. }
};
Когда 'v' является nullptr, я хочу, чтобы мой шаблон класса не включал AnotherMemberFunction и ее код, который предполагает значение для 'v', которое не является nullptr. Я не могу частично специализировать шаблон класса, указав:
template
<
class T
>
struct AClassTemple<T,nullptr>
{
};
и т. д., иначе я получаю ошибку компилятора, отражающую указанное выше правило.
v
nullptr
или нет, может быть неизвестно во время компиляции... - person Enlico   schedule 03.02.2021AClassTemplate<sometype,nullptr>
илиAClassTemplate<sometype,non_null_ptr>
, чтобы выбрать два случая, почему бы вам не заставить его просто написатьClassTemplateA<sometype>
иClassTemplateB<sometype>
? В чем преимущество использования параметра шаблона, отличного от типа, для различения двух случаев, если этот параметр нельзя вывести? Однако, если вы знаете, что этот параметр известен во время компиляции, то полученный вами ответ помогает. - person Enlico   schedule 04.02.2021