好友
阅读权限10
听众
最后登录1970-1-1
|
如下代码,原本希望通过模板直接转换类型,但是编译过程中发现在编译时无法使用typeid(string) == typeid(T))无法识别,进而其走所有分支。
同时,编译过程中使用 switch (typeId) 也是无法判断的,不能实现根据传入类型走特定分支代码,实现转换。
typedef short pg_int2;
typedef long pg_int4;
typedef long long pg_int8;
template<typename T>
T getPqFieldValue(const pqxx::field& fd)
{
pqxx::oid typeId = fd.type();
bool bIsNull = fd.is_null();
if (bIsNull)
{
return T();
}
const char* pChar = fd.c_str();
switch (typeId)
{
case 21:
{
if (typeid(pg_int2) != typeid(T))
{
return T();
}
pg_int2 nValue = fd.as<pg_int2>();
return nValue;
}
break;
case 23:
{
if (typeid(pg_int4) != typeid(T))
{
return T();
}
pg_int4 nValue = fd.as<pg_int4>();
return nValue;
}
break;
case 20:
{
if (typeid(pg_int8) != typeid(T))
{
return T();
}
pg_int8 nValue = fd.as<pg_int8>();
return nValue;
}
break;
case 16:
{
if (typeid(bool) != typeid(T))
{
return T();
}
bool bValue = fd.as<bool>();
return bValue;
}
break;
case 1700://numeric
case 701:
{
if (typeid(double) != typeid(T))
{
return T();
}
//double dValue = fd.as<double>(); //这种转换效率极低,不可取,改为通过atof转换。
double dValue = atof(pChar);
return dValue;
}
break;
default:
break;
}
string sData = pChar;
if (typeid(string) == typeid(T))
{
return sData;
}
return T();
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|