Функция шаблона C ++ с is_same type_trait не работает для типа T = std :: string - PullRequest
0 голосов
/ 03 сентября 2018

Я реализовал простую библиотеку C ++ на основе Xerces-c для анализа и чтения элементов данных из файлов конфигурации XML. Я предоставляю средство для преобразования типов данных, читаемых в int, long, double, bool, float и string.

Все элементы работают нормально, кроме std :: string, где не требуется никакого преобразования. Я просто хотел бы сравнить, используя черты и возврат, но это не работает. is_same работает только для встроенных типов?

template<typename T> T CppXMLConfigReader::getTypeVal(const std::string& key, const T& defaultVal) const
{
    T returnVal = defaultVal;
    auto iter = m_configMapItems.find(key.c_str());
    if(iter != m_configMapItems.end())
    {
        try
        {
            if(is_same<T,int>::value)
                returnVal = stoi(iter->second);
            if(is_same<T,float>::value)
                returnVal = stof(iter->second);
            if(is_same<T,long>::value)
                returnVal = stol(iter->second);
            if(is_same<T,double>::value)
                returnVal = stod(iter->second);
            if(is_same<T,bool>::value)
            {
                if(iter->second == "true" || iter->second == "1")
                    returnVal=true;
                else
                    returnVal=false;
            }
            if(is_same<T,string>::value)   // Error is from here.
                returnVal = iter->second;  // Error is from here.
        }
        catch(const invalid_argument& e)
        {
            cout << "Exception happened while converting " << iter->second << " Into rqequired type. Please investigate." << endl;
        }
    }
    return(returnVal);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...