亦庄建设局网站施工企业信用管理制度和机制
news/
2025/9/24 15:02:55/
文章来源:
亦庄建设局网站,施工企业信用管理制度和机制,可以分销的平台,发布软文是什么意思C invoke
invoke是C17标准引入的一个函数模板#xff0c;用来调用可调用对象#xff08;Callable Object#xff0c;如函数指针、函数对象、成员函数指针等#xff09;并返回结果。
invoke提供了统一的调用语法#xff0c;无论可调用对象的类型是什么#xff0c;都可以…C invoke
invoke是C17标准引入的一个函数模板用来调用可调用对象Callable Object如函数指针、函数对象、成员函数指针等并返回结果。
invoke提供了统一的调用语法无论可调用对象的类型是什么都可以使用同一种方式进行调用。
详见https://en.cppreference.com/w/cpp/utility/functional/invoke 在C17之前调用不同类型的可调用对象需要使用不同的语法比如直接调用函数、使用类对象的运算符重载操作符()来调用函数对象、使用成员函数指针来调用类成员函数等等。这些调用方式虽然能用但是不够灵活而invoke解决了这种不一致的问题。
invoke函数的实现原理是通过使用SFINAESubstitution Failure Is Not An Error技术来判断可调用对象的类型并根据类型调用对应的调用方式。因此无论可调用对象的类型是什么都可以使用invoke函数来调用而不需要使用不同的语法。
它的实现原理可以看https://en.cppreference.com/w/cpp/utility/functional/invoke
下面是invoke的示例代码
#include iostream
#include functionalvoid foo(int a, int b)
{std::cout a b a b std::endl;
}class Bar
{
public:void operator()(int a, int b)
{std::cout a - b a - b std::endl;}
};int main()
{int a 10, b 5;std::invoke(foo, a, b); // 调用普通函数Bar bar;std::invoke(bar, a, b); // 调用函数对象std::invoke(Bar::operator(), bar, a, b); // 调用成员函数std::functionvoid(int, int) f foo;std::invoke(f, a, b); // 调用std::function对象return 0;
}
总结std::invoke 提供了一种通用的函数调用语法可以方便地调用各种可调用对象。
function与invoke的区别
std::function和std::invoke是两个不同的东西功能也不同。std::function是一个函数对象的封装器可以用来封装任意类型的可调用对象比如函数指针、lambda表达式等而 std::invoke 则是一个函数模板用于在统一的接口下调用可调用对象。
比如我们可以使用std::function来存储一个函数指针
#include functional
#include iostreamvoid foo(int a, int b)
{std::cout foo( a , b ) std::endl;
}int main()
{std::functionvoid(int, int) f foo;f(1, 2);
}
上述代码中我们将函数指针foo封装成了一个std::function对象f然后通过调用f(1, 2)来调用函数foo。
std::invoke的作用是提供一种通用的函数调用语法可以用统一的方式来调用各种可调用对象而不必关心它们具体是什么类型。
比如可以使用std::invoke来调用一个东西无论这个东西是函数指针、函数对象还是成员函数指针
#include functional
#include iostreamvoid foo(int a, int b)
{std::cout foo( a , b ) std::endl;
}class Bar {
public:void bar(int a, int b) const
{std::cout Bar::bar( a , b ) std::endl;}
};int main()
{std::invoke(foo, 1, 2);Bar b;std::invoke(Bar::bar, b, 1, 2);
}
上面代码使用std::invoke分别调用了函数foo和类Bar的成员函数bar并传递了相应的参数。
总结std::function和std::invoke的使用场景是不同的。std::function 适用于需要存储可调用对象的场景而std::invoke则适用于统一调用各种不同类型的可调用对象的场景。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915850.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!