网站模版开发,友情链接工具,南京网站定制公司,网站做的自适应体验差std__invoke 的使用 文章目录 std__invoke 的使用1. std::invoke 的功能2. 语法3. 使用场景1. 调用普通函数2. 调用成员函数3. 调用成员函数#xff08;通过指针或引用#xff09;4. 调用函数对象#xff08;仿函数#xff09;5. 调用 Lambda 表达式 4. std::invoke 的优势…std__invoke 的使用 文章目录 std__invoke 的使用1. std::invoke 的功能2. 语法3. 使用场景1. 调用普通函数2. 调用成员函数3. 调用成员函数通过指针或引用4. 调用函数对象仿函数5. 调用 Lambda 表达式 4. std::invoke 的优势5. 注意事项6. 示例综合应用总结 std::invoke 是 C17 引入的一个标准库函数用于简化函数调用的语法。它允许你通过统一的接口调用普通函数、成员函数、函数对象或者 Lambda 表达式。这使得在处理不同类型的可调用对象时代码更加简洁和一致。 1. std::invoke 的功能
std::invoke 的目的是让你可以通过统一的方式来调用
普通函数成员函数函数对象仿函数Lambda 表达式
2. 语法 templatetypename _Callable, typename... _Argsinvoke(_Callable __fn, _Args... __args){return std::__invoke(std::forward_Callable(__fn),std::forward_Args(__args)...);}callable 是要调用的可调用对象例如函数指针、成员函数指针、Lambda 表达式等。args... 是传递给 callable 的参数。
3. 使用场景
1. 调用普通函数
#include iostream
#include functionalvoid print_hello(const std::string name) {std::cout Hello, name ! std::endl;
}int main() {std::invoke(print_hello, World);return 0;
}在这个例子中std::invoke 调用了普通函数 print_hello并传递了一个参数 World。
2. 调用成员函数
调用成员函数时需要额外提供对象实例或对象指针。
#include iostream
#include functionalclass MyClass {
public:
void greet(const std::string name) {std::cout Hello, name ! std::endl;
}
};int main() {MyClass obj;std::invoke(MyClass::greet, obj, World);return 0;
}在这个例子中std::invoke 调用了 MyClass 的成员函数 greet并传递了对象 obj 和参数 World。
3. 调用成员函数通过指针或引用
对于成员函数调用你可以传递成员函数指针和对象指针或者引用。
#include iostream
#include functionalclass MyClass {
public:
void greet(const std::string name) const {std::cout Hello, name ! std::endl;
}
};int main() {MyClass obj;// 使用成员函数指针调用std::invoke(MyClass::greet, obj, World);// 或者可以传递对象指针MyClass* ptr obj;std::invoke(MyClass::greet, ptr, World);return 0;
}4. 调用函数对象仿函数
std::invoke 同样适用于函数对象仿函数。
#include iostream
#include functionalstruct MyFunctionObject {
void operator()(const std::string name) const {std::cout Hello, name ! std::endl;
}
};int main() {MyFunctionObject obj;std::invoke(obj, World); // 调用仿函数return 0;
}5. 调用 Lambda 表达式
std::invoke 也可以用于调用 Lambda 表达式。
#include iostream
#include functionalint main() {auto greet [](const std::string name) {std::cout Hello, name ! std::endl;};std::invoke(greet, World); // 调用 Lambda 表达式return 0;
}4. std::invoke 的优势
简化代码它可以统一调用不同类型的可调用对象函数、成员函数、Lambda、函数对象等避免了使用不同的调用方式。类型推断std::invoke 会自动推断参数类型无需显式指定。支持成员函数它特别适用于调用成员函数避免了使用 .* 或 -* 等复杂语法。
5. 注意事项
std::invoke 是一个通用工具适用于各种类型的可调用对象。它的本质是通过反射机制来判断和调用对象。
6. 示例综合应用
#include iostream
#include functionalstruct MyClass {
void greet(const std::string name) {std::cout Hello, name ! std::endl;
}static void static_greet(const std::string name) {std::cout Hello from static function, name ! std::endl;
}
};int main() {MyClass obj;// 调用成员函数std::invoke(MyClass::greet, obj, Alice);// 调用静态成员函数std::invoke(MyClass::static_greet, Bob);// 调用 Lambdaauto lambda [](const std::string name) {std::cout Hello from lambda, name ! std::endl;};std::invoke(lambda, Charlie);return 0;
}总结
std::invoke 是一个灵活、强大的工具它统一了函数、成员函数、函数对象和 Lambda 表达式的调用方式使得 C 中的可调用对象使用变得更加简洁和一致。