我想使用第三方函数,该函数通过充满功能指针的结构提供其API。例如:
struct S {
using p_func1 = int(*)(int, int);
p_func1 func1;
using p_func2 = int(*)(char*);
p_func2 func2;
}
第三方库初始化此结构。
这些功能(func1,func2)的返回值需要检查,我希望我可以以某种方式在[[discard]]
属性中显示以确保检查返回值。
在保持结构的ABI的同时,有什么方法可以做到这一点?
编辑: 到目前为止,我能想到的最好的方法是拥有另一个结构,像这样:
struct S_wrap {
S orig;
[[nodiscard]] int func1(int a, int b){ return orig.func1(a, b); }
[[nodiscard]] int func2(char* a){ return orig.func2(a); }
}
我希望有更好的东西
答案 0 :(得分:2)
您的包装器(或任何包装器)是唯一的选择。该属性适用于函数声明符(名称),而不适用于函数的类型。因此,使用指针时它会丢失,也无法应用于指针本身:
[dcl.attr.nodiscard]
1属性令牌
nodiscard
可以应用于 函数声明中或声明中的declarator-id 类或枚举。每个中最多应出现一次 属性列表,并且不存在属性参数子句。
因此,如果函数指针返回一个int
,则防止丢弃结果的唯一方法是使用某种包装了具有已应用属性的命名函数(或operator()
)的包装器。