函数的不确定返回类型
Posted
技术标签:
【中文标题】函数的不确定返回类型【英文标题】:Indeterminate return type of a function 【发布时间】:2016-10-18 22:31:11 【问题描述】:我正在使用 C++ 语言开发 Adobe 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
是否包含int
或double
?然后你可以做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 等实数来表示字体版本。以上是关于函数的不确定返回类型的主要内容,如果未能解决你的问题,请参考以下文章
pycahrm使用docstrings来指定变量类型返回值类型函数参数类型