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

C++ Passing a member variable to a member class

本文关键字:成员类 变量 成员 C++      更新时间:2023-10-16

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

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 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);

将矢量"数字"传递给cycler是一种很好的编程实践吗?有没有更好的方法来实现我的模板?

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

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

这适用于从std::vectorstd::array的每种容器类型,包括具有std::beginstd::end的C样式数组。如果你想在一个通用容器中循环,你可以这样做,例如:

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) {
        // …
    }
}

现场演示