gpt4 book ai didi

C++ 将成员变量传递给成员类

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:15 25 4
gpt4 key购买 nike

我有遗留代码,其中使用类似的方法循环遍历顺序容器(本例中为 vector 。一些实现使用其他类型的容器)。所以我将它分解到一个模板中,这样我就可以为任何容器类型重用同一段代码。

template<template<class, class> class TContainer, class TObject>
class cycle
{
public:

explicit cycle( TContainer<TObject, std::allocator<TObject>> & container )
: mContainer( container ), index(0) {}

TObject getNext(int numObjectsToCycle)
{ return mContainer[index++ % numObjectsToCycle]; }
private:
TContainer<TObject, std::allocator<TObject>> & mContainer;
int index;
};

然后我的类(class)有一个循环器来循环我的变量数。

class myClass
{
std::vector<int> numbers;

public:
cycle<vector, int> cycler;
// Is it safe to pass numbers since it is declared first??
myClass() : cycler(numbers) {}

};

然后,我使用如下代码:

myObject.cycler.getNext(size);

将 vector “数字”传递给 cycler 是一种好的编程习惯吗?有没有更好的方法来实现我的模板?

代码实际上是能够无限循环遍历对象。我的类是从仅调用成员方法的外部代码调用的,我希望能够仅调用 getNext(),这样我就不必使用索引。

最佳答案

在标准库中存在另一种“模式”,它是迭代器模式。基本上每个容器类型都实现了 beginend ,它们分别返回指向第一个元素和尾后元素(始终保证存在)的迭代器。

这适用于所有容器类型,从 std::vectorstd::array 包括带有 std::begin 的 C 风格数组和 std::end .如果您想在通用容器中循环,您可以这样做,例如:

template<typename Container>
void cicle(Container const& c) {
for (auto const& i : c) {
// …
}
}

或者,为了更好地可视化模式:

template<typename Container>
void cicle(Container const& c) {
for (auto it = std::begin(c); it != std::end(c); ++it) {
// …
}
}

Live demo

关于C++ 将成员变量传递给成员类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288258/

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