函数

时间:2016-06-17 07:27:32

标签: c++ return-type opentype

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

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

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

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

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

typedef struct
{
    int interger;
    double real;
    bool bReal;
}RET;

然后函数原型是:

RET getOperandVal(unsigned char* buf);

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

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

非常感谢!

增加: 程序将操作数值转换为字节序列,以便在编辑后重写为文件。请考虑这个要求。

2 个答案:

答案 0 :(得分:1)

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

但您可以使用union

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

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

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

答案 1 :(得分:0)

模板类型在编译时进行评估,您无法动态更改函数原型。您可以将返回值升级到最大大小(例如总是返回double),返回结构或使用某些变体实现,如boost::variant