0

私は、入力引数として文字列、さまざまなタイプの3つの出力引数(少なくともそれがアイデアです)、および区切り文字であるcharを受け取る関数を作成しようとしています。

入力文字列は指定された文字で区切られ、関数は各文字で終了するフィールドを各出力引数に順番に割り当てます(現時点では、などの入力文字列を処理"a;bb;ccc"し、3つの出力引数のみに制限されていますが、それは問題)。

たとえば、I'd getなどの入力を10;200;3000使用し、1番目、2番目、3番目の出力引数をそれぞれ使用します。102003000

出力引数は文字列型または整数型である必要がありますが、C ++(および特にジェネリックプログラミング)に関する知識が限られているため、それを気にしないジェネリック関数を作成するのに問題があります。

私は次のコードを持っています:

template <typename T>
void parse_string (std::string &input, T &out1, T &out2, T &out3, const char delimiter)
{
    while (out3 == "")
    {
        std::string temp = input.substr(0, input.find(delimiter));
        input = input.substr(input.find(delimiter) +1);

        if (out1 == "") { out1 = temp;}
        else if (out2 == "") { out2 = temp;}
        else { out3 = temp;}
    }
}

文字列に対しては正常に機能しますが、整数に対しては明らかに機能しません。

引数が空かどうかをチェックする部分が間違っているのではないかと思います(他の部分についてはわかりません)。

私がそれを改善するのを手伝ってくれませんか?

また、ロジック自体を改善するためのアイデアを歓迎します(おそらく、引数の数を柔軟にするために可変個引数テンプレートを使用する必要がありますが、C++11標準がわかった)。

理想的には、まったく同じ関数を2回使用しているが、タイプごとに異なるシグネチャ(1つは文字列用、もう1つはint用)を使用している状況を避けたいと思います。

よろしくお願いします!

4

2 に答える 2

3

文字列を文字列に分割し(あなたがそうするように)、それらを必要な型に変換します。

あなたはそのために使用することができますboost::lexical_cast、またはstd::stringstream

template <typename To, typename From>
To cast(const From &arg)
{
    std::stringstream s;
    s << arg;
    To res;
    s >> res;

    if (s.fail())
    {
        //throw some_exception();
    }

    return res;
}

いずれにせよ、boost利用できる場合は、それが正しい方法です

于 2012-10-04T09:00:04.103 に答える
2
#include <algorithm>
#include <string>
#include <sstream>

template <typename T1, typename T2, typename T3>
void parse_string(const std::string& input, T1& out1, T2& out2,
                  T3& out3, char delimeter)
{
  std::istringstream is1(input);

  std::string field;
  for (int i = 0; std::getline(is1, field, delimeter) && i < 3; ++i)
  {
    std::istringstream is2(field);
    switch (i)
    {
    case 0: is2 >> out1; break;
    case 1: is2 >> out2; break;
    case 2: is2 >> out3; break;
    }

    if (is2.fail()) 
    {
      // do something about invalid type conversion?
    }
  }

  // up to you to decide what to do if the string has too
  // many or too few fields
}

lexical_castの方が安全です!

于 2012-10-04T09:29:25.900 に答える