小编dar*_*amo的帖子

为什么 C++ 范围“transform -> filter”为匹配过滤器谓词的值调用两次转换?

考虑使用范围库的以下代码(来自 c++20)

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> inputs{1, 2, 3, 4, 5, 6};

    auto square_it = [](auto i) {
        std::cout << i << std::endl;
        return i * 2; };

    auto results = inputs | std::views::transform(square_it) | std::views::filter([](auto i){ return i % 3 == 0; });

    for(auto r : results) {
        // std::cout << r << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

函数中的coutinsquare是记录square范围库何时调用该函数。此代码打印

1
2
3
3
4
5
6
6
Run Code Online (Sandbox Code Playgroud)

问题是,为什么匹配过滤器谓词的值会打印两次? …

c++ c++20

11
推荐指数
1
解决办法
454
查看次数

为 std::unordered_map 的专门化注册 gdb 漂亮打印机

我正在尝试为 的特定专业化注册一个漂亮打印机std::unordered_map,但由于某种原因,它总是使用 gdb 中的标准漂亮打印机std::unordered_map而不是我的专业版本。


考虑下面的类

namespace ns {

class MyClass {
public:
    std::string name;
    int value = 0;
};

}  // namespace ns
Run Code Online (Sandbox Code Playgroud)

我有一个 gdb 漂亮打印机定义为

# myprinters.py -> sourced in gdb
class MyClassPrinter:
    def __init__(self, val):
        self.name = val["name"]
        self.val = val["value"]

    def to_string(self):
        return f"MyClass(name={self.name}, value={self.val})"


import gdb.printing
pp = gdb.printing.RegexpCollectionPrettyPrinter('myprinters')
pp.add_printer('MyClass', 'MyClass', MyClassPrinter)

gdb.printing.register_pretty_printer(gdb.current_objfile(), pp, replace=True)
Run Code Online (Sandbox Code Playgroud)

现在考虑下面的主要功能

int main(int argc, char *argv[]) {
    std::tuple<int, MyClass> mytuple{10, {"name10", 10}};
    std::unordered_map<int, MyClass> mymap;
    mymap.insert({10, {"name10", …
Run Code Online (Sandbox Code Playgroud)

c++ gdb pretty-print

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

我可以让 `std::ranges::views::elements` 与我的类型范围一起工作吗

考虑Point带有x,yz值的类型。如果我有一系列Point对象,例如std::vector<Point>,我需要添加什么Point才能使其与std::ranges::views::elements范围适配器一起使用?

目的是做类似的事情

std::vector<Point> v{...};
for (auto x : v | std::ranges::views::elements<0>) {
    // do something with all `x` values
}
Run Code Online (Sandbox Code Playgroud)

文档提到std::ranges::views::elements适用于“类似元组”的值。我假设它的工作方式应该类似于我们如何使我们的类型与结构化绑定一起工作,但我似乎遗漏了一些东西

我已尝试使用以下代码

class Point {
    double x=0;
    double y=0;
    double z=0;
public:
    Point(double x, double y, double z) : x(x), y(y), z(z) {}

    template <std::size_t N>
    double get() const {
        if constexpr(N == 0)
            return x;
        else if …
Run Code Online (Sandbox Code Playgroud)

c++ c++20 std-ranges

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

标签 统计

c++ ×3

c++20 ×2

gdb ×1

pretty-print ×1

std-ranges ×1