5

这是一个关于 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。

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

4

2 回答 2

9

The usual way is to add a const overload for the member function:

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

Calling the member on a const Foo will choose this overload; calling it on a non-const will choose the original one.

Note that at() is a fairly new addition to std::map. If you're stuck with an outdated library, you'll need something like:

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);
于 2012-09-14T14:09:50.770 回答
2

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

bool operator()(Foo& foo) const

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

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

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

于 2012-09-14T14:11:02.563 回答