避免重复使用 const 和非 const 版本的 getter?

问题描述 投票:0回答:2
struct BananaHolder
{
    vector<Banana>& getBananas();
    const vector<Banana>& getBananas() const;
};

我的课程充满了这种重复。

有没有更干净、更优雅的替代方案?

c++ c++11 constants getter const-correctness
2个回答
4
投票

如果你的类返回引用,并且在可修改对象上调用时必须返回对可修改向量的引用,那么我认为没有办法避免重复 - 至少,不是重复声明。

请注意,某些类型的标准库也遇到同样的问题。例如,诸如

std::vector
之类的序列容器同时具有
const
和非
const
过载,包括
operator []
at()
back()
front()
data()
等。


0
投票

在 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。

© www.soinside.com 2019 - 2024. All rights reserved.