将指向数据成员的指针传递给std :: invoke时,用例和用途是什么?

问题描述 投票:0回答:1

[我正在阅读有关cpp参考的std::invoke,并且想知道在哪种情况下我们需要将指向数据成员的指针作为第二个参数作为对象,而将对象作为第二个参数作为参数。

从cpp参考中指出:

使用参数args调用Callable对象f。如INVOKE(std :: forward(f),std :: forward(args)...)。

其中INVOKE(f,t1,t2,...,tN)定义如下:

...

然后第二点是:

否则,如果N == 1且f是指向类的数据成员的指针,则指向>

[确定,让我们进一步看一下,并假设我正在使用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;
}  

以及如何将指向数据成员的指针与可调用概念相关联?

我正在阅读有关cpp引用上的std :: invoke,并且想知道在哪种情况下我们需要将指向数据成员的指针和作为第二参数的对象作为第一个参数传递。来自...

c++ c++11 c++17 stdthread c++-concepts
1个回答
3
投票

您可能认为只有指向成员函数的指针才有用。也就是说,类似:

struct Widget {
    bool valid() const;
};

std::vector<Widget> widgets;
bool all_valid = std::ranges::all_of(widgets, &Widget::valid);
© www.soinside.com 2019 - 2024. All rights reserved.