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



我有一个包含数据成员的类。

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

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

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

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

由于变量因名称而异,因此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";

演示。

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

最新更新