C++17 没有默认构造函数的地图放置(私有默认构造函数)



我喜欢使用私有默认构造函数将对象放入映射中。因此,请发现以下代码不起作用:

class DB {
public:
DB(std::string user, std::string password,
std::string db, std::string host, unsigned int port = 3306);
static DB& instance(
std::string const& session_name,
std::string const& user = "user",
std::string const& password = "password",
std::string const& db = "database",
std::string const& host = "localhost",
unsigned int port = 3306) {
auto instance = database_instances.find(session_name);
if (instance == database_instances.end()) {
//database_instances.emplace(session_name, user, password, db, host, port);
//database_instances.insert( std::unordered_map< std::string, DB >::value_type ( session_name, DB{user, password, db, host, port}));
database_instances.emplace(std::piecewise_construct,
std::forward_as_tuple(session_name),
std::forward_as_tuple(user, password, db, host, port));
}
return database_instances[session_name];
}
static std::shared_ptr<DB> instance(
std::string const& session_name);
static DB& instance();
~DB() = default;
private:
DB() = default;
DB(const DB& );
DB & operator = (const DB &);
/** fields: user, password ... **/
static std::map<std::string, DB> database_instances;
};

有没有办法C++使用私有默认构造函数执行此操作?

您确定给出错误的行不是这一行吗:

return database_instances[session_name];

而不是呼唤emplace

该行将尝试在映射中不存在键的情况下默认构造值DB