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;
}
我有一个 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;
}