struct BananaHolder
{
vector<Banana>& getBananas();
const vector<Banana>& getBananas() const;
};
我的课程充满了这种重复。
有没有更干净、更优雅的替代方案?
如果你的类有返回引用,并且在可修改对象上调用时必须返回对可修改向量的引用,那么我认为没有办法避免重复 - 至少,不是重复声明。
请注意,某些类型的标准库也遇到同样的问题。例如,诸如
std::vector
之类的序列容器同时具有 const
和非 const
过载,包括 operator []
、at()
、back()
、front()
、data()
等。
在 C++23 中,您可以使用 显式对象参数(又名推导)解决此问题:
struct BananaHolder
{
vector<Banana> m_bananas;
// using abbreviated function templates
auto& getBananas(this auto&& self) {
return self.m_banans;
}
// or more verbosely
template <typename Self>
auto& getBanans(this Self&& self) {
return self.m_banans;
}
}
请注意,这不仅涵盖
const BananHolder
和 BananHolder
,还涵盖 const
、volatile
、左值引用和右值引用限定条件的所有组合。
如果你想充分利用这个,你可以写:
// to get the same behavior without templates, we would need 16 overloads
template <typename Self>
auto& getBanans(this Self&& self) {
return std::forward<Self>(self).m_banans;
}
在 C++23 之前,无法避免代码重复。 您必须编写两个 getter。