C++ 使用std::string参数和不可移动/可复制参数构建std::map
我试图构建一个简单的日志系统,但我的概念遇到了一个问题:C++ 使用std::string参数和不可移动/可复制参数构建std::map,c++,c++11,stl,C++,C++11,Stl,我试图构建一个简单的日志系统,但我的概念遇到了一个问题: class logger_instance { std::string log_file; std::string log_type; std::ofstream log; public: logger_instance(std::string log_type) : log_type(log_type), log_file("logs\\" + log_type + ".log"), log(log_f
class logger_instance
{
std::string log_file;
std::string log_type;
std::ofstream log;
public:
logger_instance(std::string log_type) : log_type(log_type), log_file("logs\\" + log_type + ".log"), log(log_file)
{
operator << ("logger_instance(" + log_type + ") init.\n");
}
std::string get_log_type() const
{
return log_type;
}
std::string get_log_file() const
{
return log_file;
}
logger_instance& operator << (std::string message)
{
time_t current_time;
time(¤t_time);
log << ctime(¤t_time);
log << " : ";
log << message;
log << "\n";
}
};
class logger_manager
{
std::map < std::string, logger_instance > loggers;
public:
void add_logger(std::string logger)
{
auto it = loggers.find(logger);
if (it == loggers.end())
{
loggers.emplace(logger, logger);
}
}
logger_instance& operator[](std::string logger)
{
return loggers[logger];
}
};
类记录器\u实例
{
字符串日志文件;
std::字符串日志类型;
std::流测井;
公众:
logger_实例(std::string log_类型):log_类型(log_类型)、log_文件(“logs\\”+log_类型+”.log)、log(log_文件)
{
操作员在地图上安置是一件相当奇怪的事情。我会推荐斯科特·迈耶的最新著作,或者看看。它是关于cwuks(斯科特的术语)
但要解决问题,请使用堆。
通过将logger_实例更改为manager中唯一的_ptr。
例如:
类记录器\u管理器
{
std::map记录器;
公众:
void add_记录器(std::string记录器)
{
自动it=记录器。查找(记录器);
if(it==loggers.end())
{
安置(记录器,使_独一无二(记录器));
}
}
记录器\实例和运算符[](标准::字符串记录器)
{
返回*记录器[记录器];
}
};
Unrelated:您在logger\u instance::operator中忘记了return*这个
,您正在使用logger
作为emplace
的两个参数,但第二个应该是logger\u instance
,而不是std::string
。
class logger_manager
{
std::map < std::string, unique_ptr<logger_instance> > loggers;
public:
void add_logger(std::string logger)
{
auto it = loggers.find(logger);
if (it == loggers.end())
{
loggers.emplace(logger, make_unique<logger_instance>(logger));
}
}
logger_instance& operator[](std::string logger)
{
return *loggers[logger];
}
};