Концепция C 20 должна работать только для чисел, но не для символов

#c #c 20 #c -concepts

Вопрос:

Может ли кто-нибудь объяснить, как тип данных char поддерживается концепцией AdditionFeasible в приведенном ниже фрагменте кода и как мы можем предотвратить это и гарантировать, что он работает только для чисел ?

 template< class T >
concept AdditionFeasible = requires(Tamp; f, Tamp; s) 
{
    f   s;
};

template <AdditionFeasible f>
f sum(f a, f b)
{
    return a   b;
}
int main()
{
    std::cout<<"sum of 2 and 3 is "<<sum(2,3)<<std::endl;
    std::cout<<"sum of 'K' and 'V' is"<<sum('K','V')<<std::endl;
    return 0;
}
 

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

1. Символы-это числа. Мы все время используем его в таких конструкциях, как ch - '0' .

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

3. Персонажи также не являются нереальными. Это просто цифры (не «внутренне», а во всех смыслах этого слова) . Сложение и все другие операции имеют для них прекрасный смысл.

4. Вы можете исключить char (или любой другой тип, который вы хотите) с require !std::same_as<char> помощью синтаксиса или любого другого, но он произвольный и капризный.

Ответ №1:

STL имеет трассировку типов, is_arimethic чтобы гарантировать, что тип является только числовым, а также избегать неожиданных типов, которые не являются числовыми типами. char Тип особый, мы также рассматриваем его как номер. Единственный способ-это явно исключить его

 template< class T >
concept AdditionFeasible = std::is_arithmetic_v<T> amp;amp; ! std::same_as<T, char> amp;amp; requires(Tamp; f, Tamp; s) {
   f   s;
};
 

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

1. наверное, хотят убрать unsigned char и signed char тоже

2. @Caleth, который бы удалил int8_t и uint8_t тоже, хотя.

3. @Bob__ любой из них может быть удален путем удаления char , это определено реализацией

4. @Caleth, Насколько я понимаю (что вполне может быть неверно), признак char реализации определен, но char signed char и unsigned char должен быть разных типов .

5. @Bob__ да, но ничто не говорит , что int8_t это должен быть псевдоним для signed char и uint8_t псевдоним для unsigned char , один из них может быть псевдонимом для char