吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 742|回复: 0
收起左侧

[学习记录] 编译过程中使用模板遇到的相关问题 typeid(string) == typeid(T)

[复制链接]
zhibai1989 发表于 2022-4-14 18:04
如下代码,原本希望通过模板直接转换类型,但是编译过程中发现在编译时无法使用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();
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表