zhibai1989 发表于 2022-4-14 18:04

编译过程中使用模板遇到的相关问题 typeid(string) == typeid(T)

如下代码,原本希望通过模板直接转换类型,但是编译过程中发现在编译时无法使用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();
}
页: [1]
查看完整版本: 编译过程中使用模板遇到的相关问题 typeid(string) == typeid(T)