【问题标题】:[[nodiscard]] to a function pointer[[nodiscard]] 指向函数指针
【发布时间】:2019-06-21 06:05:51
【问题描述】:

我想使用第三方函数,它通过一个充满函数指针的结构体提供它的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); }
}

我希望有更好的东西

【问题讨论】:

  • 我并不是说这是骗人的,但here 接受的答案可以解决问题。
  • @paler123 这个答案确实很有见地。我仍在寻找最适合我的情况的答案

标签: c++ c++17 nodiscard


【解决方案1】:

您的包装器(或任何包装器)是唯一可行的方法。该属性适用于函数 declarator-id(它的名称),而不是函数的类型。所以在使用指针的时候会丢失,也不能应用到指针本身:

[dcl.attr.nodiscard]

1 属性标记nodiscard 可以应用于 declarator-id 在函数声明或声明中 类或枚举。每次最多出现一次 属性列表且不存在属性参数子句。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多