What is std::invoke in c++?
What is std::invoke in c++?
我刚刚读到了std::thread
和std::bind
,我遇到了Callable
概念和std::invoke
。
我在cpp偏好上阅读了有关std::invoke
的信息,但我不明白它说了什么。这是我的问题:
什么是std::invoke
、std::function
、std::bind
和Callable
概念?他们之间是什么关系?
std::invoke
接受一些可调用的东西,以及用来调用它的参数,然后进行调用。std::invoke( f, args... )
是对键入f(args...)
的略微概括,也可以处理一些其他情况。
可调用的内容包括函数指针或引用、成员函数指针、带operator()
的对象或指向成员数据的指针。
在成员案例中,第一个参数被解释为this
。 然后将剩余的参数传递给()
(指针到成员数据的情况除外),std::reference_wrapper
解包。
调用是C++标准中的一个概念;C++17 只是暴露了一个直接这样做的std::invoke
。 我怀疑它被暴露的部分原因是它在进行其他元编程时很有用,部分原因是每个标准库都已经有一个 INVOKE 的实现并且公开它基本上是免费的,部分原因是当它是一个具体的事情时,它使谈论 INVOKE 更容易。
除了特定于C++的细节之外,Callable
对象是"可以调用的东西"。它不一定是一个函数:C++有许多可以调用的类型,并且每次出现任何类型(阅读:通用代码)时遍历它们都是有问题的,而且重复太多。
这就是std::invoke
的用途 - 它允许毫不费力地调用可以调用的通用对象(根据 C++17,满足Callable
概念)。
让我们考虑一个简单的例子:
void foo() { std::cout << "hello worldn"; };
template <bool b>
struct optionally_callable
{
std::enable_if_t<b> operator() () { std::cout << "hi againn"; }
};
int main()
{
auto c = [] { std::cout << "hi from lambdan" ;};
std::invoke(foo);
std::invoke(c);
auto o = optionally_callable<true>{};
//auto o2 = optionally_callable<false>{};
std::invoke(o);
}
o2
是不可调用的,也就是说,std::is_invocable<decltype(o2)>::value
是false
.
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp