我刚刚读过这篇文章std::thread
,std::bind
而且我已经面对这个Callable
概念了std::invoke
.
我读了std::invoke
关于cppreference但是我不明白它说的是什么.这里是我的问题:
什么是std::invoke
,std::function
,std::bind
和Callable
概念?他们之间的关系是什么?
Yak*_*ont 26
std::invoke
需要一些可调用的东西,以及调用它的参数,并进行调用. std::invoke( f, args... )
是一种轻微的打字概括f(args...)
,也可以处理一些其他情况.
可调用的东西包括函数指针或引用,成员函数指针,带有operator()
a 的对象或指向成员数据的指针.
在成员案例中,第一个参数被解释为this
.然后传递剩余的参数()
(指向成员数据的情况除外).
INVOKE是C++标准中的一个概念; C++ 17简单地暴露了std::invoke
直接使用它的东西.我怀疑它暴露的部分是因为它在进行其他元编程时很有用,部分原因是每个标准库都已经有一个INVOKE的实现并暴露它基本上是免费的,部分是因为它使得INVOKE的讨论变得更容易.
一个Callable
对象,除了C++ -具体细节,"东西,可以被称为".它不一定是一个函数:C++有许多类型可以被调用,并且每次出现时都会经历它们(读取:通用代码)是有问题且过于重复的.
这std::invoke
就是为了 - 它允许一个可以被调用的通用对象(根据C++ 17,满足这个Callable
概念)可以毫不费力地调用.
让我们考虑一个简单的例子:
void foo() { std::cout << "hello world\n"; };
template <bool b>
struct optionally_callable
{
std::enable_if_t<b> operator() () { std::cout << "hi again\n"; }
};
int main()
{
auto c = [] { std::cout << "hi from lambda\n" ;};
std::invoke(foo);
std::invoke(c);
auto o = optionally_callable<true>{};
//auto o2 = optionally_callable<false>{};
std::invoke(o);
}
Run Code Online (Sandbox Code Playgroud)
o2
是不是可调用的,也就是说,std::is_invocable<decltype(o2)>::value
是false
.
归档时间: |
|
查看次数: |
9551 次 |
最近记录: |