[[nodiscard]] 到函数指针

Cur*_*519 6 c++ c++17 nodiscard

我想使用第三方函数,它通过充满函数指针的结构提供其 API。例如:

struct S {
    using p_func1 = int(*)(int, int);
    p_func1 func1;
    using p_func2 = int(*)(char*);
    p_func2 func2;
}
Run Code Online (Sandbox Code Playgroud)

第三方库初始化该结构。需要检查这些函数(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); }
}
Run Code Online (Sandbox Code Playgroud)

我希望有更好的东西

Sto*_*ica 3

您的包装纸(或任何包装纸)是唯一的出路。该属性适用于函数声明符 id(其名称),而不是函数的类型。所以在使用指针时它会丢失,也不能应用于指针本身:

[dcl.attr.nodiscard]

1 attribute-tokennodiscard可以应用于函数声明中的 declarator-id 或类或枚举的声明。它在每个属性列表中最多出现一次,并且不应出现任何属性参数子句。

因此,如果函数指针返回int,则防止丢弃结果的唯一方法是使用某种带有operator()应用了该属性的命名函数(或 )的包装器。