如何为不同的类重用相同的实现方法 我练习C++,我被困在下面的代码中,试图优化它们。我想知道我是否可以做些什么来优化他们方法的实现。因为除了常量之外,其他方法都是相同的。提前谢谢

如何为不同的类重用相同的实现方法 我练习C++,我被困在下面的代码中,试图优化它们。我想知道我是否可以做些什么来优化他们方法的实现。因为除了常量之外,其他方法都是相同的。提前谢谢,c++,class,optimization,reusability,C++,Class,Optimization,Reusability,多明尼奥斯 class HP { private: int valor; static const int LIMITE_INFERIOR = 0; static const int LIMITE_SUPERIOR = 1000; public: void setValor(int); int getValor() { return valor; } }; class MP { private: int valor; static const

多明尼奥斯

class HP {
private:

  int valor;

  static const int LIMITE_INFERIOR = 0;
  static const int LIMITE_SUPERIOR = 1000;

public:

  void setValor(int);
  int getValor() {
    return valor;
  }
};

class MP {
private:

  int valor;

  static const int LIMITE_INFERIOR = 0;
  static const int LIMITE_SUPERIOR = 500;

public:

  void setValor(int);
  int getValor() {
    return valor;
  }
};
多明尼奥斯

void HP::setValor(int valor) {

  if (valor < LIMITE_INFERIOR) this->valor = LIMITE_INFERIOR;
  else if (valor > LIMITE_SUPERIOR) this->valor = LIMITE_SUPERIOR;
  else this->valor = valor;
}

void MP::setValor(int valor) {

  if (valor < LIMITE_INFERIOR) this->valor = LIMITE_INFERIOR;
  else if (valor > LIMITE_SUPERIOR) this->valor = LIMITE_SUPERIOR;
  else this->valor = valor;
}
void HP::setValor(int valor){
如果(valorvalor=LIMITE_-subsier;
否则如果(valor>LIMITE_SUPERIOR)此->valor=LIMITE_SUPERIOR;
否则这->勇气=勇气;
}
void MP::setValor(int valor){
如果(valorvalor=LIMITE_-subsier;
否则如果(valor>LIMITE_SUPERIOR)此->valor=LIMITE_SUPERIOR;
否则这->勇气=勇气;
}
正如您所看到的,这两个类的setValor是相同的。我尝试使用“模板”来实现层次结构,但由于常量的原因,这对我来说不起作用

this->valor = std::clamp(valor, LIMITE_INFERIOR, LIMITE_SUPERIOR);

模板
类度量{
私人:
英勇;
公众:
void setValor(intv){valor=std::clamp(v,lo,hi);}
int getValor(){return valor;}
};
结构HPTag;
使用HP=公制;
结构MPTag;
使用MP=公制;

哦,谢谢!您还知道我可以做些什么来避免两次编写setValor的实现吗?因为实现是一样的,除了常量?用一种可能的方法更新了答案。嘿,还有一个问题,为什么要使用上面的结构?标记?它们可能是必需的,也可能不是必需的,这取决于设计的其余部分。它们允许您创建两种不同类型的度量,即使它们恰好具有相同的边界。例如,您可以在它们上重载函数然后
C
C
是两种不同的类型-例如,您可以有两个重载函数
void f(C)
void f(C)
。即使
C
在其定义中没有实际使用
t
,这也是正确的;事实上,
SomeType
SomeOtherType
甚至不需要定义,只需声明它们就足够了。它们是声明为
struct
还是
class
没有任何区别。
template <typename Tag, int lo, int hi>
class Metric {
private:
  int valor;

public:
  void setValor(int v) { valor = std::clamp(v, lo, hi); }
  int getValor() { return valor; }
};

struct HPTag;
using HP = Metric<HPTag, 0, 1000>;

struct MPTag;
using MP = Metric<MPTag, 0, 500>;