是否有理由不能通过类型模式处理泛型变量?请考虑以下代码:
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) 我最近偶然发现了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++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)