std::invoke的灵活性使其成为在泛型编程中调用可调用对象的理想选择,尤其是在需要处理不同类型可调用对象的情况下。它能够自动推导返回类型和参数类型,简化了函数调用的代码。
#include <iostream>
#include <string>
#include <sstream>
// 普通函数
void print_args_as_string(const std::string& str) {
std::cout << str << std::endl;
}
// 仿函数
struct PrintArgsAsString {
void operator()(const std::string& str) const {
std::cout << str << std::endl;
}
};
// 成员函数
class Foo {
public:
void print_args_as_string(const std::string& str) const {
std::cout << str << std::endl;
}
};
int main() {
// 调用普通函数
std::invoke(print_args_as_string, "Hello");
// 调用仿函数
PrintArgsAsString print_obj;
std::invoke(print_obj, "World");
// 调用成员函数
const Foo foo;
std::invoke(&Foo::print_args_as_string, foo, "Example");
// 调用 lambda 表达式
auto lambda = [](const std::string& str) {
std::cout << str << std::endl;
};
// std::invoke(lambda, 1); 编译失败
std::invoke(lambda, "Lambda");
return 0;
}
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自 张拓的博客!