C++ pqxx postgresql 离散连接 classes,作用域 class 指针

C++ pqxx postgresql discrete connection classes, scoping class pointer

我有一个 classDBProc,它连接到 PostgreSQL,并允许用户提交 queries/retrieve 结果。

在功能上,一切正常。

DBProc::connect() 函数接受连接类型的可选参数。 3 种变体是:直接、惰性、异步。

我有代码可以根据用户的选择实例化正确的连接 class。我预先初始化 3 unique_ptr<>,每个可能的连接 class,然后使用 switch 语句选择 selected class 类型。

一切正常...但是

我的偏好是使用一个 class 变量来引用 连接 class

(所有 classes 都具有完全相同的功能),但我认为没有简单的方法可以做到这一点。 'auto& currentConnection = lazyConnection' 在 switch 语句中工作正常,但当然在代码块之后超出范围。

如果有一种方法可以在块内创建一个 var 并允许在块外看到它,而无需 1st 声明它,那是可行的,但我认为这在 c++ 中是不可能的。

我不能先声明它,因为所有这些class都需要在声明时进行初始化。 所以...c++atch 22 ;-)

所以,每次我需要使用连接时,我都需要一个 switch 语句到 select 正确的指针。

我查看了模板、联合、extern,但没有找到使用其中任何一个的方法。

如果有人知道有没有办法做到这一点,请描述一下。

这是 class 函数的代码片段:

bool DBProc::connect(ConnectionType type) {

...

unique_ptr<pqxx::connection> connect;
unique_ptr<pqxx::lazyconnection> lzy_connect;
unique_ptr<pqxx::asyncconnection> async_connect;

try
{
    switch (type) {
        case ConnectionType::direct : {
            connect =  make_unique<pqxx::connection>(connOpts);
            break;
        }
        case ConnectionType::lazy : {
            lzy_connect =  make_unique<pqxx::lazyconnection>(connOpts);
            break;
        }
        case ConnectionType::async : {
            async_connect =  make_unique<pqxx::asyncconnection>(connOpts);
            break;
        }
} catch
    ...
}

'some programmer dude'

评论中提供的有效答案

Why not have a std::unique_ptr to pqxx::connection_base which is the common base class for all connection types? – Some programmer dude

简化代码:

unique_ptr<pqxx::connection_base> base_connect;

try
{
    switch (type) {
        case ConnectionType::direct : {
            base_connect = make_unique<pqxx::connection>(connOpts);
            break;
        }
        case ConnectionType::lazy : {
            base_connect = make_unique<pqxx::lazyconnection>(connOpts);
            break;
        }
        case ConnectionType::async : {
            base_connect =  make_unique<pqxx::asyncconnection>(connOpts);
            break;
        }
        default:
            error += "No valid connection type supplied (direct | lazy | async)";
            return false;
            break;
    }