小编neo*_*nxc的帖子

C#7.0案例模式匹配泛型参数

是否有理由不能通过类型模式处理泛型变量?请考虑以下代码:

public static int CompareValues<T>(T left, T right)
{
  switch (left)
  {
    case IComparable<T> comparableDif:
      return comparableDif.CompareTo(right);
    case System.Numerics.Complex c:
      return c.Magnitude
        .CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
    default:
      throw new ArgumentException("unsupported type");
  }
}
Run Code Online (Sandbox Code Playgroud)

IComparable接口上的第一个匹配是可以的,但第二个匹配不编译.为什么我必须使用这个拳击解决方法?

case object o when o is System.Numerics.Complex:
  return ((System.Numerics.Complex)o).Magnitude
    .CompareTo(((System.Numerics.Complex)(object)right).Magnitude);
Run Code Online (Sandbox Code Playgroud)

c# generics switch-statement c#-7.0

13
推荐指数
1
解决办法
5254
查看次数

传递给std :: for_each的函数是否允许复制序列元素?

我最近偶然发现了cppreference中的这个措辞:

与其他算法不同,for_each不允许复制序列中的元素,即使它们可以轻易复制.

声明是否正确?我没有在标准中找到任何理由.我能理解得很清楚吗?暗示以下示例来自同一页面无效?

struct Sum
{
    Sum(): sum{0} { }
    void operator()(int n) { sum += n; }
    int sum;
};

int main()
{
    std::vector<int> nums{3, 4, 2, 8, 15, 267};
 
    // ...
 
    // calls Sum::operator() for each number
    Sum s = std::for_each(nums.begin(), nums.end(), Sum());
 
    // ...
}
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

6
推荐指数
1
解决办法
184
查看次数

范围适配器对于可视范围背后的参数是否懒惰?

C++20 标准在[range.adaptors.general]中表示范围适配器

当迭代结果视图时延迟评估。

另一方面,在[range.filter.view]中,filter_view 的 begin 函数有一个注释,提到了缓存结果。那么适配器的懒惰程度如何呢?

当执行以下代码时:

#include <iostream>
#include <ranges>

void print(std::ranges::range auto&& r)
{
    for (const auto& item : r)
    {
        std::cout << item << ", ";
    }
    std::cout << " <end of range>\n";
}

int main()
{
    using namespace std::ranges;

    bool filter = false;
    
    auto v = iota_view{4, 10} | views::filter([&filter](auto item){return filter;});

    // multipass guarantee
    static_assert(std::ranges::forward_range<decltype(v)>);

    filter = true;
    print(v);

    filter = false;
    print(v);

    filter = true;
    print(v);
} …
Run Code Online (Sandbox Code Playgroud)

c++ c++20 std-ranges

2
推荐指数
1
解决办法
577
查看次数