【问题标题】:Avoid duplicate functions for each member variable避免每个成员变量的重复函数
【发布时间】:2017-05-29 13:43:23
【问题描述】:

我编写了用于设置顶点属性的辅助函数。如您所见,这 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];
    }
}

我考虑的事情:

  • 模板不能在这里工作,因为它们不处理成员变量
  • 我可以通过传递要使用的变量的布尔标志来组合前两个函数。但这对第三个功能没有帮助。
  • 我可以添加指向顶点类的成员变量的指针和一个可供选择的枚举,但这会带来太多(性能)开销
  • 也许是 Lambda,也许是元编程?

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

【问题讨论】:

  • 为什么你认为模板不能处理成员变量指针?
  • 标识符不能用作模板参数。我就是这个意思。
  • 你的意思是像this
  • 我不知道这是可能的。现在效果很好。

标签: c++


【解决方案1】:

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

另外两个包装器类似,通用代码变为:

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

【讨论】:

  • 通过正确使用模板,当成员类型不匹配时,解决方案仍然可以工作。
  • 非常有帮助的答案。类成员指针似乎很合适。 V的成员变量没有相同的类型,但我认为可以通过将setCommon作为函数模板来轻松解决。
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2012-06-17
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多