我寻找一种使用模板的聪明方法。我有一个class
命名状态,可能是某个英雄或恶棍的状态。他有三个统计信息,分别为strength
,speed
和agility
。
现在我有一个set
功能。但是我不想为每个属性声明一个新函数,这个名称是DRY。
我看到两个选择:
set(Stat::STRENGTH, 5)
一样,在set函数中做一个switch
语句。 class StatValue
之类的状态参数对象,然后将对象传递给set(StatValue new_value)
。但是我仍然需要检查参数的类型,以便为它指定正确的方法。现在我想知道是否有一些聪明的方法可以使用枚举和模板来实现这一点,并避免必须创建所有这些类,而是保持它的美观和干净。
#include <iostream>
#include <string>
enum class Stat
{
STRENGTH, SPEED, AGILITY,
};
class Status
{
public:
template <Stat S>
void set(int)
{
/* blank */
}
template <Stat S>
int get(void)
{
/* blank */
return 0;
}
private:
int strength;
int speed;
int agility;
};
int main(void)
{
Status status{};
status.set<Stat::STRENGTH>(5);
std::cout << status.get<Stat::STRENGTH>();
}
我看到的一种可能性是将所有值放在容器中并通过枚举基地访问它们,如下所示:
template <Stat S>
void set(int value)
{
this->container_of_stats.at(static_cast<int>(S)) = value;
}
但是我认为这会破坏拥有一个对象的美感,如果你把它的所有数据成员都放到一个容器中。还有其他聪明的方法吗?