3

重大度チャネル ロガーを使用しようとしていますBOOST_LOG_SEVが、const メソッドではないという問題に遭遇しました。open_record() と push_record() の両方が原因であると考えています。

これにより、基本的に、クラス内のすべてのメソッドを const にしないように強制されます。これは、ロガーに書き出す必要があるためです。私はそれを行う余裕がありません-そのため、現時点ではグローバルロガーに制限されています.

私の現在の実装では、各クラスにはチャネルとしてクラス名を持つロガーがあり (コンストラクターで初期化されます)、任意の時点でログ メッセージを発行します。BOOST_LOG_SEV(this->logger, level)

非定数の背後にある理由と、私の設計が Boost::Log を意図していないかどうかを知りたいです。

4

1 に答える 1

4

ロガーは自身の状態を変更するため、const にすることはできません。ロガーがスレッド セーフであり、オブジェクトの論理状態を変更しない場合、mutable キーワードを使用する必要がある場所の完璧な例です。

ロガーを変更可能なクラス memberにしmutable SomeLoggerType my_logger;ます。次に、const メンバーでそれを変更できるようになります。これはまさに、mutable意図されたものです。

mutable が悪いコードの匂いであるというあなたのコメントに関しては、 mutable はまさにこの種の目的のためのエスケープハッチです。実際にオブジェクトの論理状態を変更していない場合 (および c++11 で内部的に同期されている場合)、可変は問題ありません。変更可能な使用法のもう 1 つの完全に良い例は、キャッシュです。

于 2013-11-24T09:04:49.537 に答える