Getter 函数的常量正确性

Posted

技术标签:

【中文标题】Getter 函数的常量正确性【英文标题】:Const Correctness for Getter Function 【发布时间】:2012-09-14 14:07:19 【问题描述】:

这是一个关于 const 正确性的简单问题。

我有这门课:

template <class T>
class Foo

public:
    std::map<std::string, boost::any> members; 

    template <typename T>
    std::vector<T>& member(const std::string& memberName) 
    
        return boost::any_cast<std::vector<T>&>(members[memberName]);
    
;

然后我有一个函子,其中包括以下内容:

bool operator()(Foo& foo) const

    std::vector<T> & member = foo.member<T>(_memberName);

这里让我感到困惑的是,我不能通过引用 const 来传递 Foo,因为我正在调用非 const 成员 getter 函数。关于它的签名,这给人的印象是 operator() 改变了 foo。

我应该纠正这个问题吗?如果是,如何纠正?

【问题讨论】:

【参考方案1】:

通常的做法是为成员函数添加const重载:

template <typename T>
std::vector<T> const & member(const std::string& memberName) const
              ^^^^^                                         ^^^^^
    return boost::any_cast<std::vector<T> const &>(members.at(memberName));
                                         ^^^^^            ^^

const Foo 上调用成员将选择此重载;在非const 上调用它 会选择原来的。

请注意,at() 是对std::map 的一个相当新的补充。如果你被一个过时的库困住了,你需要这样的东西:

std::map<std::string, boost::any>::const_iterator found = members.find(memberName);
if (found == members.end()) 
    throw std::runtime_error("Couldn't find " + memberName);

return boost::any_cast<std::vector<T> const &>(found->second);

【讨论】:

【参考方案2】:

const 正确性适用于您执行其方法的对象。所以:

bool operator()(Foo& foo) const

意味着operator() 不会改变函子类中的任何内容,例如_memberName(它似乎是函子类的成员)。

它的定义方式,允许改变Foo(调用非常量方法)。

编辑: 请参阅Mike Seymour 的答案,因为它描述了一种解决方法。我个人做了很多,但似乎没有完全得到你的问题。 :)

【讨论】:

但问题是,我们可以安排通过const 参考传递foo 吗?

以上是关于Getter 函数的常量正确性的主要内容,如果未能解决你的问题,请参考以下文章

c ++中的getter/setter是正确的方法吗?

C中的常量正确性

快速正确使用getter和setter

重复、常量和非常量、getter 的宏解决方案?

Jackson 还需要 getter 方法来使用 @JsonCreator 正确序列化 bean 属性

从比较函数访问成员变量/getter