使用模板的类型转换有奇怪的行为

时间:2012-10-15 11:32:37

标签: c++ string templates boolean

我有一个函数,旨在将字符串从配置文件转换为各种不同的类型。需要插入一个特殊情况来处理bool,因为“false”在使用字符串流时等于true。

单独的函数实际上不是一个选项,因为它涉及我们正在使用的每种类型的类型检查。

当一个类的一部分之前,该函数正常工作,但是为了使它更有用,它被移入了它自己的启动函数。该函数在返回true上抛出2个错误。返回false是正常的。

下面是代码示例和visual studio抛出的错误。

template <typename T>
static T StringCast(string inValue)
{
    if(typeid(T) == typeid(bool))
    {
        if(inValue == "true")
            return true;
        if(inValue == "false")
            return false;
        if(inValue == "1")
            return true;
        if(inValue == "0")
            return false;
        return false;
    }

    std::istringstream stream(inValue);
    T t;
    stream >> t;
    return t;
}

错误1错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(const std :: basic_string&lt; _Elem,_Traits,_Ax&gt;&amp;)':无法将参数1从'bool'转换为'const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;'

错误2错误C2664:'std :: basic_string&lt; _Elem,_Traits,_Ax&gt; :: basic_string(const std :: basic_string&lt; _Elem,_Traits,_Ax&gt;&amp;)':无法将参数1从'bool'转换为'const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;'

1 个答案:

答案 0 :(得分:2)

如果你想为bool专门化 - 那么只需为bool定义专业化。你的方式是不可能的。使用下面的正确方法:

template <typename T>
T StringCast(string inValue)
{
    std::istringstream stream(inValue);
    T t;
    stream >> t;
    return t;
}

template <>
bool StringCast<bool>(string inValue)
{
        if(inValue == "true")
            return true;
        if(inValue == "false")
            return false;
        if(inValue == "1")
            return true;
        if(inValue == "0")
            return false;
        return false;
}

int main() {
   int a = StringCast<int>("112");
   bool b = StringCast<bool>("true"); 
}