[[nodiscard]] на указатель на функцию - PullRequest
0 голосов
/ 28 января 2019

Я хочу использовать сторонние функции, которые предоставляют его 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); }
}

Я надеюсьесть что-то лучше

1 Ответ

0 голосов
/ 28 января 2019

Ваша обертка (или любая обертка) - единственный путь.Атрибут применяется к идентификатору объявления функции (его имени), а не к типу функции.Поэтому он теряется при использовании указателя и не может применяться к самому указателю:

[dcl.attr.nodiscard]

1 Атрибут-токен nodiscard может быть применен к объявителю-идентификатору в объявлении функции или к объявлению класса или перечисления.Он должен появляться не более одного раза в каждом списке атрибутов, и не должно присутствовать никакого атрибута-аргумента-предложения.

Так что, если указатели функций возвращают int, единственный способ предотвратить сбросВ результате мы используем какую-то оболочку с именованной функцией (или operator()), к которой применен атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...