gpt4 book ai didi

c++ - 如何在没有重复代码的情况下处理 getter 的 const/non const 组合?

转载 作者:行者123 更新时间:2023-12-02 06:09:13 27 4
gpt4 key购买 nike

假设我有一个结构,它有一个名称和一些与之关联的值:

struct Season {
std::string name;
// Mean temperature over the season
double meanTemperature;
// Days since the start of year when it's strongest
float strongestAt;
// Fraction of a year it applies to, compared to other seasons
float yearFraction;
}

本类(class)描述每年的一个季节。假设我有一个它们的集合,其中包含全年:

// made up method that is supposed to find a season (I don't use it in real code)
int findIndex(const std::vector<Season>& in, std::function<bool(const Season&)>);
class SeasonCollection
{
public:
const Season* GetSeason(const std::string& name) const
{
const int index = findIndex(_seasons, [name](const Season& s) { return s.seasonName == name; });
return index != -1 ? &_seasons[index] : nullptr;
}
Season* GetSeason(const std::string& name)
{
const int index = findIndex(_seasons, [name](const Season& s) { return s.seasonName == name; });
return index != -1 ? &_seasons[index] : nullptr;
}
private:
//! Settings for seasons
std::vector<Season> _seasons;
};

在该集合中,您可以看到我需要同时获取 const Season*Season* 。这是因为在某些情况下,该集合是只读的,而在其他情况下,它是可写的。

还有其他获取季节的方法,例如一年中的某一天(例如圣诞节 24.12 )。我想要一个const getter 用于获取它们的每种方法,但我也不想复制粘贴它们中的每一个,只需添加 const .

最好的方法是什么?

最佳答案

我不想这么说,但是const_cast。您要做的就是创建并调用 const getter,然后删除它返回的 const,因为您知道自己位于非 const getter 内的非常量对象中。这看起来像

  const Season* GetSeason(const std::string& name) const
{
const int index = findIndex(_seasons, [name](const Season& s) { return s.seasonName == name; });
return index != -1 ? &_seasons[index] : nullptr;
}
Season* GetSeason(const std::string& name)
{
return const_cast<Season*>(const_cast<SeasonCollection const *>(this)->GetSeason(name));
// ^ remove the const^ ^ add const to call the const getter ^^call const getter^
}

关于c++ - 如何在没有重复代码的情况下处理 getter 的 const/non const 组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59324414/

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