在不编写显式设置器的情况下修改私有 class 数据成员的便捷方法是什么?模板有用吗?

What is handy way to modify the private class data members without writing explicit setters? Are templates useful?

我有一个 class 和数据成员。

class Sph
{
public:
    Sph( float radius , float segments , const Shader& shader );
    Sph(const Sph& geometry);
    Sph& operator = (const Sph& geometry);
    ~Sph();
    void init();
    void CleanUp();
    void draw();
    void CreateUI(QFormLayout* layout);
    std::vector< Sum_Vertices > GetVertices();

private:
    float Radius,Segments;
    bool isInited;
    unsigned int m_VAO, m_VBO , m_IBO;
    int iNumsToDraw;
    bool isChanged;
    Shader shader;
    int indexCount;
};

为了更改 class 的数据,我必须编写单独的方法。

void SetRadius( float radius )
{
   this->Radius = radius;
}

是否可以编写一个模板函数来更改 class 的不同数据成员?

class Sph {
  /* ... */
public:
  template<typename ParamType, typename... Extras> void SetParam(ParamType, Extras...);
  /* ... */
};

template<> inline void Sph::SetParam(float radius) {
  Radius = radius;
}

template<> inline void Sph::SetParam(float segments,
    bool ignored_dummy_argument_to_distinguish_between_two_overloads)
{
  Segments = segments;
}

template<> inline void Sph::SetParam(bool inited) {
  isInited = inited;
}

由于变量的名称不同,template 在这里可能无济于事。


这是一个经典案例,您可以在其中使用宏来发挥自己的优势和轻松。

定义:

#define GET_SET(X) X; \ 
    public: const decltype(X)& get_##X() const { return X; } \ 
            void set_##X(const decltype(X)& value) { X = value; } private:

效用:

class Sph
{
   ...
private:
  float GET_SET(Radius);
  float GET_SET(Segments);
  ...
};

用法:

Sph sph;
sph.set_Radius(3.3);
cout << sph.get_Radius() << "\n";

Demo.