没有默认构造函数的C ++ 17 Map Emplace(私有默认构造函数)

时间:2020-02-03 15:26:42

标签: c++ c++17 stdmap

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

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 ++中,有没有一种方法可以使用私有默认构造函数来做到这一点?

1 个答案:

答案 0 :(得分:2)

您确定给出错误的行不是此行:

   return database_instances[session_name];

而不是调用emplace

如果键在映射中不存在,则该行将尝试默认构造一个DB值。