函数的不确定返回类型

Posted

技术标签:

【中文标题】函数的不确定返回类型【英文标题】:Indeterminate return type of a function 【发布时间】:2016-10-18 22:31:11 【问题描述】:

我正在使用 C++ 语言开发 Adob​​e Type 1 字体的解析器。当我尝试解码 DICT 数据时出现问题。

DICT 中的操作数以字节序列形式存储在 PDF 文件中,可以是整数或实数。

我定义了一个函数,其原型为getOperandVal(unsigned char* buf),用于将序列解码为数字。问题就出现了。

在解析buf之前,我们无法知道buf是实数还是整数。所以无法确定返回值类型,应该是int还是double

一种解决方案是使用结构作为返回值类型。结构如下:

typedef struct

    int interger;
    double real;
    bool bReal;
RET;

那么函数原型就是:

RET getOperandVal(unsigned char* buf);

但我认为它并不紧凑。首先,使用起来不方便。其次,当数据量大时,程序运行速度会变慢。

谁能给我一个更好的解决方案?模板能做到吗?

非常感谢!

补充: 程序会将操作数的值转换为字节序列,以便在编辑后重写到文件中。请考虑一下这个要求。

【问题讨论】:

您能否简单地(即不完全解析)确定buf 是否包含intdouble?然后你可以做if (tryParse(buf)) 【参考方案1】:

你不能使用模板,因为你在编译时不知道会返回什么类型。

但你可以使用union:

struct Int_real 
  union 
    int integer;
    double real;
  ;
  bool is_real;
;

一个非常好的想法是通过使其安全来改进它(只允许访问处于活动状态的联合字段)。

很快(希望如此),您将能够使用std::any

【讨论】:

你可以使用例如boost::variant 或其他变体实现。 @Jens 是的,但已经有一个答案指出了变体【参考方案2】:

模板类型在编译时评估,您不能动态更改函数原型。您可以将返回值放大到最大大小(例如始终返回双精度值)、返回结构或使用一些变体实现,例如 boost::variant

【讨论】:

"高档返回值到最大尺寸"可能有用。我可以在整数的末尾添加一个小数点和 0,就像在 1234 中添加 '.0' 使其成为 1234.0。确定我使用返回值时的类型。但是当原来的类型是double,value是1234.0时,判断就会出错。 Adobe Type1 可以使用 365.0 等实数来表示字体版本。

以上是关于函数的不确定返回类型的主要内容,如果未能解决你的问题,请参考以下文章

如何修复ruby中返回的不匹配对象类型?

staruml里方法的返回值类型怎么设

pycahrm使用docstrings来指定变量类型返回值类型函数参数类型

函数的返回类型有几种?它们的含义是啥?

Kotlin函数 ② ( Unit 函数 | TODO 函数抛出异常返回 Nothing 类型 | 反引号函数名 )

c复习过程随笔七