如何在没有重复代码的情况下处理 const/non getter 的 const 组合?
How to handle const/non const combination of getters without duplicate code?
假设我有一个结构,它有一个名称和一些与之关联的值:
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,然后删除它 returns 的 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^
}
来自 Scott Meyers 的书,Effective C++,第 4 项:
When const and non-const member functions have essentially identical
implementations, code duplication can be avoided by having the
non-const version call the const version.
假设我有一个结构,它有一个名称和一些与之关联的值:
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,然后删除它 returns 的 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^
}
来自 Scott Meyers 的书,Effective C++,第 4 项:
When const and non-const member functions have essentially identical implementations, code duplication can be avoided by having the non-const version call the const version.