【问题标题】:cpp function to retrieve values of various datatypecpp函数检索各种数据类型的值
【发布时间】:2012-08-31 05:15:44
【问题描述】:

我想写一个类似这样的 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 的数据类型。这可以改进还是有其他选择来完成这项任务?

【问题讨论】:

  • >>> 模板
  • @LuchianGrigore 模板如何提供帮助?类型在 fieldType 中,我认为在运行时确定。
  • 我认为这不是一个好的设计。我宁愿创建一个模板方法ReadField<T>
  • 感谢您的建议
  • 内容是一串数字和字符。我想读取数字或字符,并返回剩余的字符串以供进一步处理

标签: c++ function types return-value


【解决方案1】:

看看boost::variant

在你的情况下,你会使用类似的东西:

typedef boost::variant<char, int double, std::string> out_t;

【讨论】:

    【解决方案2】:

    使用联合,它允许选择变量的类型;

    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;}
    

    【讨论】:

      【解决方案3】:

      您可能可以使用模板和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;
      }
      

      虽然我不得不承认我不喜欢这个解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多