0

これに似たcpp関数を記述したいのですが、outValは、それぞれの関数から返された対応するタイプのデータを受け入れる必要があります。

void ReadFieldByType(char fieldType, string content, string& outStr, **unknown**& outVal){
unsigned int ifield;
char cField;
string sField;
double dField;
switch (fieldType)
                {
                case 'c':
                ReadChar(content, content, cField);
                outVal = cField;
                break;
                case 'd':
                ReadInteger(content, content, ifield);
                outVal = ifield;
                break;
                case 'f':
                ReadDouble(content, content, dField);
                outVal = dField;
                break;
                case 's':
                ReadString(content, content, sField);
                outVal = sField;
                break;
                default:
                break;
                }
                outStr = content;}

outValのデータ型を設定する方法がわかりません。これを改善できますか、またはこのタスクを実行するための他の選択肢はありますか?

4

3 に答える 3

2

を見てくださいboost::variant

あなたの場合、あなたは次のようなものを使うでしょう:

typedef boost::variant<char, int double, std::string> out_t;
于 2012-09-06T11:36:25.327 に答える
1

あなたはおそらくテンプレートとtypeid演算子でそれを行うことができます:

template<class T>
void ReadField(string content, string& outStr, T& outVal)
{
    if (typeid(T) == typeid(int))
        ReadInteger(content, content, outVal);
    else if (typeid(T) == typeid(char))
        ReadChar(content, content, outVal);
    else if (typeid(T) == typeid(double))
        ReadDouble(content, content, outVal);
    else if (typeid(T) == typeid(std::string))
        ReadString(content, content, outVal);

    outStr = content;
}

私は解決策が好きではないことを認めなければなりませんが。

于 2012-09-06T11:48:19.053 に答える
0

ユニオンを使用すると、変数のタイプを選択できます。

union
{
    unsigned int ifield;
    char cField;
    string sField;
    double dField;} outVal;
void ReadFieldByType(char fieldType, string content, string& outStr, **unknown**& outVal){

switch (fieldType)
                {
                case 'c':
                ReadChar(content, content, cField);
                outVal.cField = cField;
                break;
                case 'd':
                ReadInteger(content, content, ifield);
                outVal.ifield = ifield;
                break;
                case 'f':
                ReadDouble(content, content, dField);
                outVal.dField = dField;
                break;
                case 's':
                ReadString(content, content, sField);
                outVal.sField = sField;
                break;
                default:
                break;
                }
                outStr = content;}
于 2012-09-06T11:38:23.717 に答える