【问题标题】:Function call with a union return type [closed]具有联合返回类型的函数调用[关闭]
【发布时间】:2014-08-13 08:45:04
【问题描述】:

我必须在我的代码中使用this 库函数。此函数返回 struct 包括 union 类似这样的内容:

union  (
     int   int_value;
    double   double_value;
    const char *   text_value;
} value;

每次调用此函数时,我都必须使用 switch 语句检查返回类型,如引用页面中的示例。真正的问题是 我必须在我的代码中多次使用这个函数,准确地说是 15 次。每次都检查返回类型是非常非常令人沮丧的,如果它不是乱七八糟的,那么生成的代码就会非常难看。我试图将此代码包装在返回类型为 auto 的成员函数中。但它甚至没有编译。

  • 我该怎么做?
  • 正确的做法应该是什么?

【问题讨论】:

  • 检查返回类型是什么意思?如果它返回“char*”或“int”或“double”?你能举个例子吗?
  • 这个问题非常不清楚。返回此union 的函数在哪里?你到底是怎么称呼它的,更重要的是 - 你如何确定union 中的哪个属性是相关的?
  • 抱歉这个问题。函数是这样的:gaia-gis.it/gaia-sins/freexl-1.0.0e-doxy-doc/…
  • 问题似乎是没有功能。
  • 正如我现在从您给定的链接中看到的那样,我的答案适合您的问题。如果没有,请详细说明您的问题:-)

标签: c++ error-handling


【解决方案1】:

您的示例代码不适合真实世界的代码!

如果你有一个联合作为返回类型,你必须知道联合的哪个字段持有有效值。所以我希望你有类似的东西:

struct SOME_TYPE
{
    enum { IS_TEXT, IS_INT, IS_DOUBLE } valid_type;

    union return_val 
    {
        char* text_val;
        int int_val;
        double double_val;
    }
 };

如果您的返回类型包含这样的类型信息(这是必须的),则很容易创建casting class,它将这个结构/联合作为参数。这个类现在可以为你做任何类型的测试,类型安全!并自动。它还可以生成(工厂模式)子类,这些子类可以做所有只对给定值类型有效的动作。

class UnionHandler
{
     public:
         UnionHandler( const SOME_TYPE& val )
         {
              switch ( val.valid_type) 
              {
                  case... whatever you want
              }
         }

     bool Check() { // whatever you want }

}

但是:避免工会!!!!!!!!!

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 2020-02-29
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多