【问题标题】:C++20 Concept should only work for numbers but not charsC++20 概念应该只适用于数字而不是字符
【发布时间】:2021-06-16 06:29:32
【问题描述】:

有人可以在下面的代码 sn-p 中解释 AdditionFeasible 概念如何支持 char 数据类型,以及我们如何防止这种情况并确保它仅适用于数字?

template< class T >
concept AdditionFeasible = requires(T& f, T& 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;
}

【问题讨论】:

  • 字符是数字。我们一直在 ch - '0' 这样的结构中使用它。
  • 同意内部字符是数字,但有什么方法可以区分它们并确保函数只适用于实数,否则会引发有意义的错误
  • 角色并非不真实。它们只是数字(不是“内部”,而是各种意义上的数字)。加法和所有其他操作对他们来说非常有意义。
  • 您可以使用require !std::same_as&lt;char&gt; 或任何语法来排除char(或您想要的任何其他类型),但它是任意且反复无常的。

标签: c++ c++20 c++-concepts


【解决方案1】:

STL 有一个类型 trailt is_arimethic 以确保类型仅为数字并避免非数字类型的意外类型。 char 类型是一种特殊类型,我们也将其视为数字。唯一的方法是明确排除它

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

【讨论】:

  • 可能也想删除unsigned charsigned char
  • @Caleth 不过,这也会删除int8_tuint8_t
  • @Bob__ 可以通过删除 char 删除其中任何一个,它的实现已定义
  • @Caleth 据我了解(这很可能是错误的),char 的符号是实现定义的,但charsigned charunsigned char 应该是different types
  • @Bob__ 是的,但没有说int8_t 必须是signed charuint8_t 的别名unsigned char 的别名,其中一个可能是char 的别名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2022-10-14
  • 1970-01-01
  • 2020-09-28
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多