#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