Каковы преимущества и полезность при передаче указателя на член данных в std :: invoke? - PullRequest
0 голосов
/ 18 октября 2019

Я читал о std :: invoke по ссылке на cpp, и мне было интересно, в каких ситуациях нам когда-либо потребуется передавать в качестве первого аргумента указатель на член данных и объект в качестве второго аргумента.

Из ссылки на cpp говорится:

Вызывает вызываемый объект f с параметрами args. Как и в случае INVOKE (std :: forward (f), std :: forward (args) ...).

, где INVOKE (f, t1, t2, ..., tN) определяется следующим образом:

...

, а затем вторая точка:

В противном случае, если N == 1 и f является указателем на член данныхclass

Хорошо, давайте посмотрим на это дальше и предположим, что я использую std::thread (который использует конструктор std::invoke):

Например, немного неясномне когда было бы полезно (или что может заставить) использовать потоки таким образом?

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_+i << '\n'; }
    int num_;

    void print_num(int i) const {
        std::cout << i << '\n';
    }
};

int main() {
    const Foo foo(314159);
    std::thread t(&Foo::num_, foo);
    t.join();
    return 0;
}  

А как указатель на элемент данных может быть связан с вызываемой концепцией?

1 Ответ

3 голосов
/ 18 октября 2019

Вы можете подумать, что полезны только указатели на функции-члены. То есть что-то вроде:

struct Widget {
    bool valid() const;
};

std::vector<Widget> widgets;
bool all_valid = std::ranges::all_of(widgets, &Widget::valid);

Это будет std::invoke указатель на функцию-член &Widget::valid на каждом из Widget s. Но вы могли бы так же легко сконструировать Widget, чтобы valid был просто флагом, а не функцией-членом. И проверка того, что все Widget являются valid, является такой же разумной вещью:

struct Widget {
    bool valid;
};

std::vector<Widget> widgets;
bool all_valid = std::ranges::all_of(widgets, &Widget::valid);

Единственное отличие состоит в том, что этот std::invoke указатель на член данные вместо указателя на член функция . Но все же полезно.

...