在不编写显式设置器的情况下修改私有 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.
我有一个 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.