【发布时间】:2013-11-12 12:22:55
【问题描述】:
我有一个类,其方法对某些变量执行一些检查并返回一个值,并最终打印一条警告消息。由于该方法不会更改任何类变量,因此我将其定义为 const。但是,为了避免淹没输出,我想在几次(或一次)打印后抑制警告打印。我一直无法找到保持方法 const 的解决方案,这可能吗(容易)?
【问题讨论】:
-
您可以在函数中将本地计数器定义为静态变量。
我有一个类,其方法对某些变量执行一些检查并返回一个值,并最终打印一条警告消息。由于该方法不会更改任何类变量,因此我将其定义为 const。但是,为了避免淹没输出,我想在几次(或一次)打印后抑制警告打印。我一直无法找到保持方法 const 的解决方案,这可能吗(容易)?
【问题讨论】:
使用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;
};
由于有很多关于多线程的cmets,例如原子计数器
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;
};
【讨论】:
const,用户通常希望它是 MT 安全的,因此您可能需要考虑使用原子计数器。
const 操作中调用的),那么它必须在 C++11 中是线程安全的。然而,IIRC 标准中的措辞并没有明确说明这一点,而是说库的 const 操作是线程安全的。如果库在其const 操作中作用的对象不是,则此保证失败。 Herb Sutter 对这个领域非常感兴趣,IIRC 他认为标准应该只要求 const 始终表示“线程安全”。
const 操作与非-const) 不安全。
你可以(坚持 ForEveR 中的 counter 示例)
const_cast<int>(counter) 投射const
解决方案将取决于您的实际问题,您会在问题中添加代码 sn-p 吗?
【讨论】: