C++标准库std命名空间中是否存在可给变量赋值的functor?
标准库确实有这类工具,分版本给你说明
嘿,你想要的这种能给指定变量赋值的 functor,C++标准库是提供支持的,不过不同版本的用法略有区别,我给你详细说下:
C++11及以后:用std::bind包装赋值操作
你可以借助std::bind把赋值运算符和目标变量的引用绑定起来,得到的 functor 就能接收一个值并把它赋给目标变量。举个实际的例子:
#include <functional> #include <string> // 假设这是你说的那个需要回调的函数 void some_function_that_calls_callback(const std::function<void(const std::string&)>& callback) { callback("Hello from callback!"); } int main() { std::string str; // 用bind绑定赋值操作,std::ref确保绑定的是变量引用,_1是占位符代表后续传入的参数 some_function_that_calls_callback(std::bind(std::ref(str), std::placeholders::_1)); // 此时str已经被赋值为"Hello from callback!" return 0; }
这里一定要用std::ref,因为std::bind默认会拷贝参数,用它才能让赋值操作作用在你原来的变量上,而不是一个拷贝出来的临时变量。
C++20及以后:std::ranges::assign_to(语义更清晰)
C++20的范围库专门提供了std::ranges::assign_to,这是一个语义更明确的赋值 functor,配合std::bind_front使用非常顺手:
#include <functional> #include <string> #include <ranges> void some_function_that_calls_callback(const std::function<void(const std::string&)>& callback) { callback("Hello C++20!"); } int main() { std::string str; // bind_front把目标变量的引用绑定到assign_to的第一个参数,剩下的参数就是要赋的值 some_function_that_calls_callback(std::bind_front(std::ranges::assign_to, std::ref(str))); return 0; }
这种写法比bind更直观,一看就知道是在做赋值操作。
额外推荐:用Lambda表达式(灵活又好读)
其实从C++11开始,lambda表达式是更常用的替代方案,写法简洁还不用记bind的语法,可读性拉满:
#include <functional> #include <string> void some_function_that_calls_callback(const std::function<void(const std::string&)>& callback) { callback("Hello Lambda!"); } int main() { std::string str; // 直接捕获str的引用,接收参数后赋值 some_function_that_calls_callback([&str](const std::string& val) { str = val; }); return 0; }
很多时候这种写法比标准库的functor更受欢迎,因为逻辑一目了然,也不需要额外的头文件(除了functional,如果回调要求的是std::function的话)。
内容的提问来源于stack exchange,提问作者gct
相关产品推荐
相关产品推荐

