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 回答