Можно ли перегружать классы с помощью C 20?

#c #c 20 #c -concepts

Вопрос:

Можно ли перегружать классы концепциями с помощью C 20 ? Я только что попробовал это, и это не работает.

 templatelt;typename StringTgt;  requires requires( StringT t )  {  { t } -gt; same_aslt;stringgt;;  } struct S { };  templatelt;typename StringTgt;  requires requires( StringT t )  {  { t } -gt; same_aslt;wstringgt;;  } struct S { };  

Комментарии:

1. Как всегда, уточните «не работает» , пожалуйста!

2. Нет, не может быть нескольких классов с одним и тем же именем.

3. @Quimby: Есть, с enable_if, но это очень неуклюже.

4. @BonitaMontero: Нет, даже с enable_if .

5. @Клаус: Потому что ничто из этого не является «перегрузкой».

Ответ №1:

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

Вы можете подумать, что это просто другое название для того же самого, но различие неуловимо важно. Перегрузка означает наличие нескольких определений, прикрепленных к одному и тому же имени. Каждый экземпляр шаблона структуры создает новое имя, поэтому «перегрузка» — это не то, что здесь происходит.

Типичный способ сделать то, что вы хотите, — создать неопределенное объявление для вашей структуры, а затем предоставить необходимые специализации.

Принимая ваш код как есть, он будет выглядеть так:

 #include lt;stringgt; #include lt;conceptsgt;  using namespace std;  templatelt;typename Tgt; struct S;  templatelt;typename StringTgt;  requires requires( StringT t )  {  { t } -gt; same_aslt;stringgt;;  } struct Slt;StringTgt; { };  templatelt;typename StringTgt;  requires requires( StringT t )  {  { t } -gt; same_aslt;wstringgt;;  } struct Slt;StringTgt; { };  

Однако, если вы собираетесь использовать только a std::same_as , вы можете просто специализироваться непосредственно на типе:

 #include lt;stringgt;  templatelt;typename Tgt; struct S;  templatelt;gt; struct Slt;std::stringgt; { };  templatelt;gt; struct Slt;std::wstringgt; { };  

Комментарии:

1. Это был всего лишь пример. Я нахожусь в особом случае, когда мне нужны концепции.

2. @BonitaMontero Вот почему я поместил и то, и другое: ответ на заданный вами вопрос и идеальное решение для кода, который вы опубликовали, на случай, если здесь появится кто-то еще.

3. @BonitaMontero тогда, возможно, вам следует спросить о вашей реальной ситуации.