0

このような質問が他にもあることは知っていますが、あまり明確ではありません。

私はすでに答えを持っていると確信しているので、これはばかげた質問のように感じますが、とにかく質問させてください。

したがって、基本的には文字列を受け取り、適切な変数の型に基づいて次のように変換する関数があります。

template<class T>
void ConvertValue(std::string str, T &variable)
{
    variable = static_cast<T>(str);
}

これで問題ないようですよね?しかし、問題は、文字列を int または float に変換することはできないため、int と float、および変換できない他の型に対してテンプレートの特殊化を行う必要があるため、私が求めているのは、このようなもの:

void ConvertValue(std::string str, int &variable) { variable = atoi(str.c_str()); }
void ConvertValue(std::string str, float &variable) { ... }
void ConvertValue(std::string str, double &variable) { ... }
void ConvertValue(std::string str, std::vector<int> &variable) { ... }

..等

または、テンプレートの特殊化を使用する必要がありますか? どちらがより理にかなっていますか?ほとんどの型には独自の変換関数があるため、関数のオーバーロードに傾いています。関数のオーバーロードはわずかに異なるため、論理的には意味がありますが、何か不足しているかどうかはわかりません。

関数のオーバーロードに固執する必要がありますか? または、テンプレートの専門化に切り替えますか?

4

4 に答える 4

1

関数の内部が型ごとに異なる必要があり、型チェックが含まれる可能性がある場合は、複数の関数を使用する方が簡単でクリーンです。

一方、変換用の toString() メソッドを持つクラスがたくさんあるとします。内部は常に同じであるため、テンプレートを使用します。

于 2013-04-30T23:01:21.727 に答える
0

私は使用しますstd::istringstream

template <typename T>
T ConvertValue(const std::string& str)
{
    std::istringstream iss(str);

    T ret;
    if (!(iss >> ret))
    {
        throw std::bad_cast("Failed!");
    }

    return ret;
}
于 2013-04-30T23:04:11.440 に答える
0

これはあなたの質問に対する答えです:

C++ で typeof 変数を取得する方法

はい、それはテンプレートの専門化でなければなりません。

于 2013-04-30T23:06:18.900 に答える