允许const成员函数使用mutable编辑某个成员变量

时间:2015-11-30 08:39:36

标签: c++ c++11 memoization mutable

我想应用Memoization技术来提高" Line"类是这样的:

class line{
    public:
        line() = default;
        ~line() = default;

        float segment_length() const;

        Tpoint first;
        Tpoint second;
    };

如您所见,成员函数segment_length被标记为const,因为它只是计算长度而不影响类。但是,在应用Memoization之后,类行变为:

class line{
    public:
        line() = default;
        ~line() = default;

        float segment_length();

        Tpoint first;
        Tpoint second;

    private:
        float norm_of_line_cashed = -1; //for optimization issue
    };

成员函数segment_length不再是const,因为它改变了norm_of_line_cashed memebnre变量。

问题:

在这种情况下,正确的方式是什么:

  • segment_length保留为non-const成员函数。
  • 再次const并将norm_of_line_cashed标记为mutable

1 个答案:

答案 0 :(得分:4)

我会将segment_length标记为const并将norm_of_line_cashed *标记为mutable

这遵循逻辑constness 的概念,而不是按位物理常量。您只修改了外部世界不可见的内部状态,因此即使您在技术上修改了类,也会保留逻辑常量。这正是mutable的用途,这似乎是一个可靠的设计选择。

一个注意事项:您可能希望有一些bool变量(或std::experimental::optional)来跟踪您是否有缓存的值而不是依赖于易碎的标志值并且可能导致未来的头痛。

*也许你的意思是"缓存"。

相关问题