禁止从const方法打印消息

Dar*_*ioP 5 c++ methods const

我有一个类,它有一个方法对某些变量执行一些检查并返回一个值,并最终打印一条警告消息.由于该方法不会更改任何类变量,因此我将其定义为const.然而,为了避免泛滥输出,我想在几次(或仅一次)打印后抑制警告打印.我无法找到保持方法常量的解决方案,这是否可能(简单)?

For*_*veR 8

怎么用mutable柜台?我认为,它应该是可接受的,因为它不是对象的状态,它是内部逻辑状态.

像这样的东西

class Printer
{
public:
   Printer() : counter(0) {}
   void output() const
   {
      if (counter++ < max_warnings)
      {
         std::cout << "Something special" << std::endl;
      }
   }
private:
   static const size_t max_warnings = 5;
   mutable size_t counter;
};
Run Code Online (Sandbox Code Playgroud)

实例

由于有许多关于多线程的注释,例如原子计数器

class Printer
{
public:
   Printer() : counter(0) {}
   void output() const
   {
      if (counter++ < max_warnings)
      {
         std::cout << "Something special" << std::endl;
      }
   }
private:
   static const size_t max_warnings = 5;
   mutable std::atomic<size_t> counter;
};
Run Code Online (Sandbox Code Playgroud)

  • +1但是你应该确保不会遇到多线程问题.如果某个方法标记为"const",用户通常会认为它是MT安全的,因此您可能需要考虑使用原子计数器. (3认同)
  • 而FWIW,那些"用户"包括标准库.因此,如果此函数是容器或算法使用的某些操作(或者如果从任何此类`const`操作调用它),则它必须*在C++ 11中是线程安全的.但是,IIRC标准中的措辞没有明确说明这一点,而是说库的`const`操作是线程安全的.如果库从其`const`操作执行的对象不是,则此保证失败.Herb Sutter对这个领域感到非常兴奋,IIRC他的观点是标准应该只需要`const`来表示"线程安全". (2认同)