首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏灰子学技术

    std::function与std::bind

    一、背景介绍: 函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda表达式或其他可调用对象就无能为力了,因此,C++11推出了std::function与std::bind这两件大杀器 include <memory> #include <functional> void f(int n1, int n2, int n3, const int& n4, int n5) { std this auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1); f3(5); std::cout << "2) bind to :ref和std:cref来使用引用。 ::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3)); n1 = 10; n2 = 11;

    1.4K10编辑于 2022-01-18
  • 来自专栏Zaqdt_ACM

    C++11异步编程(std::async, std::future, std::packaged_task, std::promise)

           std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。 下面先介绍一下std::future, std::packaged_task, std::promise。 << std::this_thread::get_id() << std::endl; std::this_thread::sleep_for(std::chrono::seconds(5)); return std::endl; std::cout << std::this_thread::get_id() << std::endl; t.join(); return 0; } std::promise () << std::endl; std::cout << std::this_thread::get_id() << std::endl; return 0; }

    16.8K30发布于 2020-02-15
  • 来自专栏常用代码块

    | std::string 与 std::wstring转化

    #include <string>#include <locale>#include <codecvt>// convert string to wstringinline std::wstring to_wide_string (const std::string& input){std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;return converter.from_bytes (input);}// convert wstring to string inline std::string to_byte_string(const std::wstring& input){// std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;std::wstring_convert<std::codecvt_utf8

    1.4K20编辑于 2022-12-05
  • 来自专栏RTSP/RTMP直播相关

    std::atomic和std::mutex区别

    std::atomic介绍​ ​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>。​ 在多线程调用下,利用std::atomic可实现数据结构的无锁设计。​​ ​和互斥量的不同之处在于,std::atomic原子操作,主要是保护一个变量,互斥量的保护范围更大,可以一段代码或一个变量。 原子类型和内置类型对照表如下:​​ 原子类型.png 以下以两个简单的例子,比较std::mutex和std::atomic执行效率 atomic和mutex性能比较 使用std::mutex #include <std::mutex> lock(mtx); cnt++; } } int main() { clock_t start_time = clock(); std::thread ::atomic,耗时比std::mutex低非常多,​使用 std::atomic ​​能大大的提高程序的运行效率。​​

    3.4K00编辑于 2022-03-12
  • 来自专栏RTSP/RTMP直播相关

    std::jthread与std::thread区别

    std::jthread是C++20新引入的线程类,与 std::thread 类似,或者说,jthread是对thread进一步的封装,功能更强大​。 ​ C++20引入的std::jthread得以解决这个问题,std::jthread对象被析构时,会自动调用join(),等待执行流结束。​ ​ std::jthread除了提供std::stop_token能够主动取消或停止正在执行的线程,还增加了std::stop_callback允许在停止线程操作时调用一组回调函数。​ \n"; std::jthread helper2(bar); std::cout << "waiting for helpers to finish..." << std::endl (1)); } int main() { std::jthread t; std::cout << "before starting, joinable: " << std::boolalpha

    1.7K20编辑于 2022-04-03
  • 来自专栏独行猫a的沉淀积累总结

    理解std::move和std::forward

    首先通过了解它们不做什么来认识std::move和std::forward是非常有用的。std::move不move任何东西,std::forward也不转发任何东西。 std::move和std::forward只是执行转换的函数(确切的说应该是函数模板)。 std::forward的情况和std::move类似,但是和std::move无条件地将它的参数转化为rvalue不同,std::forward在特定的条件下才会执行转化。 引用: 理解std::move和std::forward_土戈的博客-CSDN博客_std::forward C++11 模板 一:彻底理解 std::move 和 std::forward - 知乎 C++11中移动语义(std::move)和完美转发(std::forward) - JavaShuo std::move和std::forward的本质和区别 - 知乎

    2.3K21编辑于 2022-06-08
  • 来自专栏技术随笔心得

    std::bind in std::bind 编译失败

    *, const std::_Placeholder<1>&, std::_Bind<std::_Mem_fn<std::__cxx11::basic_string<char, std::char_traits >, std::allocator<char> >&)>(Index*, std::_Placeholder<1>)> >::type {aka std::_Bind<std::_Mem_fn<void std::__cxx11::basic_string<char>&)>)>(Index*, std::_Placeholder<1>, std::_Bind<std::_Mem_fn<std::__cxx11 std::bind()所绑定的status()的返回类型是std::string,而外层std::bind()所绑定的Update成员函数需要的参数是std::string和std::function< ::_1, static_cast<std::function<std::string(const std::string &)>>(std::bind(&Index::status, this, std

    1.5K20编辑于 2023-06-13
  • 来自专栏鲸落学习笔记

    c++中的std::stod, stCPP程序说明std::stod():stof, std::stold

    std: :stod() : 它将字符串转换为双精度。 语法: double stod( const std::string& str, std::size_t* pos = 0 ); double stod( const std::wstring& // CPP程序说明std::stod() #include <string> #include <iostream> int main(void) { std::string str = std::size_t offset = 0; a = std::stod(&str[2], &offset); b = std::stod(&str[offset "2075"; long double y = std::stof(x) + 2.5; std::cout << y; return 0; } 输出: 2077.5

    3.8K30编辑于 2022-12-14
  • 来自专栏蜉蝣禅修之道

    std::function与std::bind使用总结

    ::function与std::bind这两件大杀器。 ,替换成std::function绝对是划得来的。 std::function与std::bind双剑合璧 刚才也说道,std::function可以指向类成员函数和函数签名不一样的函数,其实,这两种函数都是一样的,因为类成员函数都有一个默认的参数,this ,作为第一个参数,这就导致了类成员函数不能直接赋值给std::function,这时候我们就需要std::bind了,简言之,std::bind的作用就是转换函数签名,将缺少的参数补上,将多了的参数去掉 ,右值函数为新函数,那么std::bind方法从第二个参数起,都是新函数所需要的参数,缺一不可,而我们可以使用std::placeholders::_1或std::placeholders::_2等等来使用原函数的参数

    12K92发布于 2019-07-29
  • 来自专栏C++11

    C++11迭代器改进:深入理解std::begin、std::end、std::next与std::prev

    C++11标准针对这些痛点引入了std::begin、std::end、std::next、std::prev四个核心函数,它们不仅统一了迭代器操作接口,还为范围for循环(range-based for std::begin和std::end的核心目标是:提供统一的迭代器获取接口,无论操作对象是标准容器、原生数组还是自定义容器,均通过std::begin(obj)和std::end(obj)获取迭代器, )对于所有定义了begin()和end()成员函数的类型(如std::vector、std::list、std::string等标准容器),std::begin和std::end直接调用其成员函数:// = std::end(iterable); ++it) { std::cout << *it << " "; } std::cout << std::endl;}int main C++11的std::begin、std::end、std::next、std::prev看似简单,实则是泛型编程思想的集中体现——它们通过函数重载、模板推导和类型萃取,将不同迭代器源(容器、数组)和不同迭代器类别

    51100编辑于 2025-07-16
  • 来自专栏C++

    C++17逻辑魔法:std::conjunction、std::disjunction 与 std::negati剖析

    std::conjunction<std::true_type, std::false_type, std::true_type> 为例,其展开过程如下:// 第一步template<>struct conjunction<std::true_type, std::false_type, std::true_type> : std::conditional_t<bool(std::true_type disjunction<std::false_type, std::true_type, std::false_type> : std::conditional_t<bool(std::false_type ); std::cout << "std::negation_v<std::is_integral<int>> is false: " << std::negation_v<std::is_integral <int>> << std::endl; std::cout << "std::negation_v<std::is_integral<double>> is true: " << std::negation_v

    67710编辑于 2025-02-06
  • 来自专栏大龄程序员的人工智能之路

    : std::function

    当然上述问题也不是没有解决方法,通过C++模板(template)就可以,std::sort的实现就使用了模板,不论使用函数、仿函数还是lambda函数实现排序算法,均可以传给std::sort。 C++11引入std::function更好的解决了这一问题。 std::function可以用于保存并调用任何可调用的东西,比如函数、lambda函数、std::bind表达式、仿函数,甚至是指向对象成员的指针。 std::function简单来说就像是个接口,且能够把符合这个接口的对象(这里对象泛指一切类型,并非面向对象编程中的对象)储存起来,更神奇的是,两个std::function的内容可以交换。 下面的示例演示了将函数指针、lambda函数和std::bind表达式传递给std::function: int add(int a, int b) { return (a + b); } int sub

    1.6K20发布于 2019-07-01
  • 来自专栏acoolgiser_zhuanlan

    : std::function

    当然上述问题也不是没有解决方法,通过C++模板(template)就可以,std::sort的实现就使用了模板,不论使用函数、仿函数还是lambda函数实现排序算法,均可以传给std::sort。 C++11引入std::function更好的解决了这一问题。 std::function可以用于保存并调用任何可调用的东西,比如函数、lambda函数、std::bind表达式、仿函数,甚至是指向对象成员的指针。 std::function简单来说就像是个接口,且能够把符合这个接口的对象(这里对象泛指一切类型,并非面向对象编程中的对象)储存起来,更神奇的是,两个std::function的内容可以交换。 下面的示例演示了将函数指针、lambda函数和std::bind表达式传递给std::function: int add(int a, int b) { return (a + b); } int sub

    2.4K30发布于 2019-06-14
  • STL的std::find和std::find_if

    好的,给你讲讲 C++ STL 里的 std::find 和 std::find_if,它们都属于 <algorithm> 头文件,都是用来在区间里查找元素的函数,但用途和灵活度稍有不同。 1. std::find功能: 在区间中查找等于给定值的第一个元素。 你用 std::find 查找名字完全等于 "Alice" 的员工。用 std::find_if 查找第一个年龄大于 30 岁的员工。 } else { std::cout << "[std::find] Alice not found\n"; } // 2. 在效率上,std::find 和 std::find_if 都是线性扫描,时间复杂度是 O(n),没有本质差别,区别在于查找条件表达方式和灵活度。

    43810编辑于 2025-08-08
  • 来自专栏大龄程序员的人工智能之路

    : std::bind

    在上一篇文章中,我们提到可调用对象(callable object),其中一种就是std::bind表达式。在这篇文章中,我们来谈谈std::bind表达式。 关于std::bind的定义如下: template< class F, class... 如果说这两点好处还不足以说服我们使用std::bind,那接下来我们要探讨的用法才是std::bind的最大用途。 < this->value << ")\n"; } void g() { std::cout << "g(" << this->value << ")\n"; } };void apply(std (&Foo::f, &foo1)); apply(std::bind(&Foo::g, &foo2)); } 在上述代码中,我们将Foo的成员函数包装成了std::function这样的类型,从而可以用在回调等场景

    1.8K60发布于 2019-07-02
  • 来自专栏sofu456

    std::getline错误

    vs低版本转高版本,std::getline报错,如下 提示 error C2027: 使用了未定义类型“std::basic_istream<char,std::char_traits> 找了istream

    67330编辑于 2022-03-07
  • 来自专栏方方的杂货铺

    如何优雅的使用 std::variant 与 std::optional

    网上有不少std::variant与std::optional的介绍, 基础的部分基本都会讲到, 这里也先简单的过一下std::variant与std::optional的常规用法. 1. std:: ::cout << "x - " << x.index() << std::endl; std::cout << "y - " << y.index() << std::endl; 1.3 获取std: :variant中的值 我们可以使用std::get() 或直接std::get()来获取variant中包含的值. double d = std::get<double>(x); std::string int i = std::get<int>(x); } catch (std::bad_variant_access e) { std::cerr << e.what() << std::endl 它还有一个特殊的类型 std::nullopt_t, 这个类型与std::nullptr_t一样, 只有一个值, std::nullopt, optional在没有设置值的情况下类型就是std::nulopt_t

    4.6K10发布于 2021-10-29
  • 来自专栏C++

    C++17 中 std::size、std::empty 和 std::data 非成员函数介绍

    在 C++17 里,std::size、std::empty 和 std::data 作为非成员函数被引入,其目的是为容器和数组提供统一的访问接口。 << std::size(arr) << std::endl; return 0;}1.4 代码解释在上述代码中,std::size(vec) 调用了 std::vector 的 size( std::cout << "Array is empty: " << std::empty(arr) << std::endl; return 0;}2.3 代码解释代码中,std:: data: " << *std::data(arr) << std::endl; return 0;}3.3 代码解释std::data(vec) 返回 std::vector 底层数据的指针 注意事项返回类型:std::size 的返回类型为 std::size_t,std::empty 的返回类型为 bool。

    63310编辑于 2025-02-16
  • 来自专栏Linux兵工厂

    C++之std::function、std::bind、lambda特性

    今天我们来说一说c++中std::function、std::bind、lambda等用法,这些用法使函数调用更加方便。 std::cout << "Result 1: " << func1(1, 2) << std::endl; std::cout << "Result 2: " << func2(3, 4) << std::endl; std::cout << "Result 3: " << func3(5, 6) << std::endl; return 0; } 在这个示例中 支持占位符:std::bind 支持占位符(std::placeholders::_1、std::placeholders::_2 等),用于指示在调用时提供的参数的位置。 2, std::placeholders::_2); std::cout << "Result 1: " << func1() << std::endl; // 输出:6 std::

    1.7K10编辑于 2024-04-15
  • 来自专栏光城(guangcity)

    深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper

    深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper 在 C++ 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象 为了解决这些问题,C++ 标准库提供了三个有用的工具:std::cref、std::ref 和 std::reference_wrapper。这篇文章将深入探讨这些工具的用途、区别以及实际应用。 1. std::cref:创建常量引用 std::cref 是一个模板函数,用于创建对常量对象的引用。它返回一个 std::reference_wrapper 对象,可以在需要引用的地方使用。 number << std::endl; return 0; } 3. std::reference_wrapper:引用的包装器 std::reference_wrapper 是一个模板类 << std::endl; std::cout << "Number 2: " << number2 << std::endl; return 0; } 在这个示例中,std::reference_wrapper

    3.4K10编辑于 2023-09-02
领券