gpt4 book ai didi

c++ - 使用没有容器的迭代器

转载 作者:搜寻专家 更新时间:2023-10-31 01:22:21 25 4
gpt4 key购买 nike

我正在混合一些 C 和 C++ 库,并且只有一个指针可用于在回调函数中执行一些工作。我需要做的就是遍历一个 vector 。这是一个未经测试的简化示例:


bool call_back(void* data){
done=...
if (!done) cout << *data++ << endl;
return done;
}

请注意,此函数位于 C++ 中的 extern "C" block 中。 call_back 将被调用,直到返回 true。我希望它每次被调用时都能计算出下一个元素。 data 是指向我可以从代码中的其他地方传递的东西的指针(上面示例中的迭代器,但可以是任何东西)。 data 中的某些内容可能会用于计算done。我看到有两个明显的选项可以提供给 data:

  1. data 指向我的 vector 。
  2. data 指向我的 vector 的迭代器。

如果没有可用的 .end() 方法,我就不能使用迭代器,对吗?我不能单独使用 vector (除非我开始删除它的数据)。我可以用 vector 和迭代器创建一个结构,但是有更好的方法吗?你会怎么做?

最佳答案

为什么不让数据指向包含您需要的所有信息的结构。

关于旧的“C”风格回调的要点是 void* 可以指向任何对象。您的回调函数知道类型是什么,但它可以是任何类型。

typedef struct Plop
{
std::vector<int>::iterator begin;
std::vector<int>::iterator end;
} Plop;

bool call_back(void* data)
{
// Or static_cast<> for the pedantic.
// I like reinterpret_cast<> because it is a clue to humans that this is dangerious
// and as long as the object was originally a Plop* pointer it is guaranteed to work.
Plop* info = reinterpret_cast<Plop*>(data);

bool done= info.begin == info.end;

if (!done) cout << *data++ << endl;
return done;
}

关于c++ - 使用没有容器的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com