使用 std::string 参数和不可移动/可复制参数构建 std::map
Building a std::map with a std::string parameter and an non-movable/copyable parameter
我正在尝试构建一个简单的日志系统,但我的概念遇到了问题:
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];
}
};
编译器:Visual Studio 2013 Update 4
我遇到的问题是 emplace 函数似乎不明白我希望在地图容器中当场构建logger_instance对象。鉴于我并不比编译器聪明,问题出在我的概念上,但我无法找到解决方案。
在地图上放置是一件相当奇怪的事情。我会推荐斯科特·迈耶斯(Scott Meyers)的最新书或看看演讲。这是关于cwuks(斯科特的术语)。
但是要解决您的问题。使用堆。通过将您的logger_instance更改为经理中的unique_ptr。例如:
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];
}
};
相关文章:
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 将函数参数"const char*"转换为"std::string_view"是
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::绑定错误参数可以成功?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- std::vector 没有重载函数的实例与参数列表匹配
- std::span<const T> 作为函数模板中的参数
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在构造函数中使用可变参数初始化 std::tuple
- 为什么我不能将引用作为 std::async 的函数参数传递
- 转发变量参数列表以模拟 std::thread
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 可变参数模板参数扩展 类型为 std::function 的类成员