避免为每个成员变量重复功能
Avoid duplicate functions for each member variable
我编写了用于设置顶点属性的助手函数。如您所见,这三个函数基本上是相同的,只是每个函数都设置了顶点的不同成员变量。因为它违背了干燥的原则,我想将它们结合起来。
void setPositions(const int offset, const sf::Vector2f (&positions)[vertexCount]) {
int index = ensureSizeAndGetIndex(offset);
for(int i = 0; i < vertexCount; i++) {
vertices[index + i].position = positions[i];
}
}
void setTexCoords(const int offset, const sf::Vector2f (&texCoords)[vertexCount]) {
int index = ensureSizeAndGetIndex(offset);
for(int i = 0; i < vertexCount; i++) {
vertices[index + i].texCoords = texCoords[i];
}
}
void setColors(const int offset, const sf::Color (&colors)[vertexCount]) {
int index = ensureSizeAndGetIndex(offset);
for(int i = 0; i < vertexCount; i++) {
vertices[index + i].color = colors[i];
}
}
我考虑的事情:
- 模板在这里无法使用,因为它们不处理成员变量
- 我可以通过传递使用该变量的Bool标志来组合前两个函数。但这对于第三个功能无济于事。
- 我可以在顶点类的成员变量中添加指针,并可以选择枚举,但这太多(性能(开销
- lambdas,也许是元编程?
只是对这里最清洁的解决方案感兴趣。
如果texCoords
,position
和color
是相同的类型,则解决方案非常简单。班级成员指针。
假设所讨论的班级看起来像这样:
class V {
public:
int texCoords;
int position;
int color;
};
然后,您的每个成员功能都变成了提供适当类成员指针的包装器。例如, setTexCoords
变为
void setTexCoords(const int offset, const sf::Vector2f (&texCoords)[vertexCount]) {
setCommon(offset, texCoords, &V::texCoords);
}
其他两个包装器类似,常见代码变为:
void setCommon(const int offset, const sf::Vector2f (&texCoords)[vertexCount],
int V::*member) {
int index = ensureSizeAndGetIndex(offset);
for(int i = 0; i < vertexCount; i++) {
vertices[index + i].*member = texCoords[i];
}
}
班级成员指针看起来像常规指针,它们具有相同的原则,但它们不是传统的指针,而且有必要充分了解它们的工作方式。有关更多信息,请参见您的C 书。
相关文章:
- 将 2D 数组传递给大小为变量的功能
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 功能原型变量范围C
- 避免为每个成员变量重复功能
- 线程安全性和静态变量/成员功能
- 功能和变量从何而来
- 无全局变量或功能参数的递归调用
- 在已经运行的功能C 中更改变量
- 将功能输出分配给变量
- 从成员变量更新类变量或调用类功能是给出运行时错误
- 如何访问C 中的功能范围变量
- 我的朋友功能无法访问私人变量
- 不同的变量和功能起作用
- 在功能中设置对象变量
- 类和本地功能变量内的全局变量
- 我需要在类C 中定义所有私人功能和变量
- 如何在Arduino的功能中提供软件变量
- 是否可以在C++中推迟 const 变量的初始化,例如 Java 的"blank final"功能?
- 无法从类中的其他功能访问同一类的变量
- 在模拟过程中更改FMI变量/功能