1

構成ファイルの文字列をさまざまな種類に変換することを目的とした関数があります。文字列ストリームを使用する場合、"false" は true と同等であるため、bool を処理するために特別なケースを挿入する必要がありました。

個別の関数は、使用しているすべての型の型チェックを伴うため、実際にはオプションではありません。

この関数は、以前はクラスの一部として正しく機能していましたが、より使いやすくするために、独自の開始関数に移動されました。関数は、戻り値 true で 2 つのエラーをスローします。戻り false は予想どおりです。

以下は、コード例とビジュアル スタジオによってスローされるエラーです。

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 に答える