【问题标题】:Concept for type name int类型名称 int 的概念
【发布时间】:2020-12-23 20:40:11
【问题描述】:

我正在尝试为类型名称int 编写一个概念,但找不到。我想不出任何仅对int 类型有效而对doublefloat 等无效的操作。是否可以用当前标准编写它?提前谢谢你。

注意:我的目标是通过修复带有问号的部分来使此代码正常工作。如果参数是int,则operation 函数返回它们的和,如果参数不是int,则函数返回它们的乘积。

template<typename T>
concept Int = requires(T t){
    ????????
};

template<typename T>
auto operation(T t1, T t2)
{
    if constexpr(!Int<T>)
        return t1 * t2;
    else
        return t1 + t2;
}

【问题讨论】:

  • 您要解决的问题是什么?
  • 您使用概念来限制模板参数。如果你对 float 和 double 没问题,为什么还要使用一个概念呢?一个简单的模板就可以了。
  • std::same_as&lt;T, int&gt;?但你为什么要写一个概念?是if constexpr(std::is_same&lt;T, int&gt;::value)?我不认为概念“转换”为布尔值,我认为 if (Integer&lt;T&gt;) 是行不通的。
  • “想不出任何只对 int 有效的操作” 一个概念不必使用requires,任何布尔表达式都可以。你可以写template &lt;typename T&gt; concept foo = std::is_same_v&lt;T, int&gt;;之类的东西(或者最好使用std::same_as
  • @KamilCuk 概念(带有模板参数)可以用作布尔值。

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


【解决方案1】:

概念由布尔表达式定义

template<typename T>
concept Int = std::is_same_v<T, int>;

但是由于concept ordering issues,还是使用比较好

template<typename T>
concept Int = std::same_as<T, int>;

但是,您应该在足够的情况下始终使用更简单的工具。在您的情况下,简单地重载就可以了

auto operation(auto t1, auto t2)
{
    return t1 * t2;
}

auto operation(int t1, int t2)
{
    return t1 + t2;
}

值得注意的是,don't specialize your functions,这通常是错误的。

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2020-09-28
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多