gpt4 book ai didi

c++ - 避免为每个成员变量重复函数

转载 作者:行者123 更新时间:2023-11-30 03:31:22 24 4
gpt4 key购买 nike

我编写了用于设置顶点属性的辅助函数。可以看到这3个函数基本相同,只是每个函数设置了不同的顶点成员变量。因为它违反了 DRY 原则并且看起来很丑,所以我想将它们结合起来。

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 标志来组合前两个函数。但这对第三个功能没有帮助。
  • 我可以添加指向顶点类的成员变量的指针和一个可供选择的枚举,但这会带来太多(性能)开销
  • 也许是 Lambda,也许是元编程?

只是对这里最干净的解决方案感兴趣。

最佳答案

如果texCoordspositioncolor是同一类型,解决方法就很简单了。类成员指针。

假设有问题的类看起来像这样:

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

其他两个wrapper类似,通用代码变为:

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++ 书籍。

关于c++ - 避免为每个成员变量重复函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44244018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com