将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
What are the usecases and usefulness when passing pointer to data member to std::invoke?
我正在阅读有关 std::invoke 的 cpp 引用,并且想知道在哪些情况下我们需要将指向数据成员的指针和对象作为第二个参数作为第一个参数传递。
从 cpp 参考中,它指出:
使用参数参数调用可调用对象 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;
}
以及如何将指向数据成员的指针与可调用的概念相关联?
您可能认为只有指向成员函数的指针才有用。也就是说,类似于:
struct Widget {
bool valid() const;
};
std::vector<Widget> widgets;
bool all_valid = std::ranges::all_of(widgets, &Widget::valid);
这将std::invoke
指向每个Widget
上的成员函数&Widget::valid
的指针。但是,您可以轻松地构造Widget
,以便valid
只是一个标志,而不是成员函数。检查所有Widget
是否都valid
同样合理
struct Widget {
bool valid;
};
std::vector<Widget> widgets;
bool all_valid = std::ranges::all_of(widgets, &Widget::valid);
唯一的区别是,这std::invoke
指向成员数据的指针,而不是指向成员函数的指针。但仍然有用。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 松弛原子与无同步情况下的记忆连贯性
- C++Union/Struct位域的实现和可移植性
- C++boost序列化多态性问题
- 其中降频广播实际上是有用的
- 如何更改唯一指针向量的可见性
- 获取 SFML 窗口的 HWND 和高可用性?
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- KeyEqual 在 std::unordered_set/std::unordered_map 中的有用性
- std::make_pair 和 std::make_tuple 在 C++17 中的有用性
- 自C 11以来,挥发性在并发编程中的有用性
- 指向非静态方法的指针的C++有用性
- 除了执行外部程序之外,fork()的有用性
- 'rand()' 的有用性 - 或者谁应该称呼 'srand()'
- 可视化的一个MS扩展到c++的有用性