1

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

单独的函数并不是一个真正的选择,因为它会涉及对我们正在使用的每种类型的类型检查。

该函数在以前是类的一部分时可以正常工作,但是为了使其更有用,它被移到了自己的启动函数中。该函数在返回 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<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : 无法将参数 1 从 'bool' 转换为 'const std: :basic_string<_Elem,_Traits,_Ax> &'

错误 2 错误 C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax> &)' : 无法将参数 1 从 'bool' 转换为 'const std: :basic_string<_Elem,_Traits,_Ax> &'

4

1 回答 1

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"); 
}
于 2012-10-15T11:39:09.877 回答