en utilisant par classe boost :: log :: sources :: logger à partir de la fonction membre const
-
15-11-2019 - |
Question
Je veux une source de journal par classe comme l'exemple basic_logger du documents
Cela fonctionne mais j'obtiens une erreur du compilateur se plaignant de la constance lors de la journalisation de quelque chose à partir d'une fonction membre const comme ceci :
#include "boost/log/sources/channel_logger.hpp"
#include "boost/log/common.hpp"
#include "boost/log/utility/init/to_console.hpp"
#include "boost/log/utility/init/common_attributes.hpp"
class Test
{
public:
// this works, not a const function
void test1()
{
BOOST_LOG(m_logger) << "Test 1";
}
// this will not compile, const function
void test2() const
{
BOOST_LOG(m_logger) << "Test 2";
}
private:
boost::log::sources::channel_logger<std::string> m_logger;
};
int main()
{
boost::log::add_common_attributes();
boost::log::init_log_to_console();
Test t;
t.test1();
t.test2();
return 1;
}
Dans cet exemple Test::test2
donne une erreur de compilation car sa const et m_logger
n'est pas. Test::test1
fonctionne bien.
Comment résoudre ce problème de manière propre sans const_cast
, mutable
etc.
La solution
Si le journal est stocké dans la classe, vous ne pouvez bien sûr pas le modifier dans un const
contexte.
Je réalise que tu as demandé autre chose, mais je pense honnêtement que mutable
est la solution appropriée ici.C'est exactement le cas d'utilisation, c'est pourquoi mutable
existe.
Autres conseils
Vous devez déplacer l'enregistreur mutable en dehors de votre classe pour que tout fonctionne correctement.Ou vous utilisez quelque chose de différent qui vous donne un objet enregistreur immuable.