首页 >后端开发 >C++ >回调在 C 中如何工作,以及它们的各种用途是什么?

回调在 C 中如何工作,以及它们的各种用途是什么?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-14 06:20:11352浏览

How Do Callbacks Work in C  , and What Are Their Various Uses?

C 中的回调及其各种用途

在 C 中,回调是类或函数接受的可调用对象(稍后讨论),用于根据提供的回调自定义当前逻辑。

使用原因回调:

  • 编写独立于被调用函数中逻辑的通用代码,允许与不同的回调重用。
  • 通知调用者特定事件,启用静态和编译-时间灵活性。

C 中的 Callable 是什么?

  • 函数指针(包括指向成员函数的指针)
  • std::函数对象
  • Lambda 表达式
  • 绑定表达式
  • 函数对象(具有重载函数调用运算符的类operator())

写入和调用回调:

函数指针:

  • 类型表示法: return_type (*)(parameter_type_1,parameter_type_2,parameter_type_3)
  • 回调调用表示法: function_pointer(argument)
  • 回调使用表示法: function(argument_list, function_pointer)

指向成员函数的指针:

  • 类型表示法: return_type (class_type::*)(parameter_type_1,参数类型_2, parameter_type_3)
  • 回调调用表示法: (class_instance.*member_function_pointer)(argument)
  • 回调使用表示法: function(argument_list, class_instance, member_function_pointer)

std::function 对象:

  • 类型表示法: std::function
  • 回调调用表示法: function_object()
  • 回调使用表示法: function(argument_list, function_object)

使用示例std::function:

泛化代码:

template<class R, class T>
void stdf_transform_every_int_templ(int *v, unsigned const n, std::function<R(T)> fp) {
  for (unsigned i = 0; i < n; ++i) {
    v[i] = fp(v[i]);
  }
}

模板化回调:

template<class F>
void transform_every_int_templ(int *v, unsigned const n, F f) {
  for (unsigned i = 0; i < n; ++i) {
    v[i] = f(v[i]);
  }
}

类型名称实施:

template <class T>
std::string type_name() {
  typedef typename std::remove_reference<T>::type TR;
  std::unique_ptr<char, void(*)(void*)> own
    (abi::__cxa_demangle(typeid(TR).name(), nullptr,
    nullptr, nullptr), std::free);
  std::string r = own != nullptr?own.get():typeid(TR).name();
  if (std::is_const<TR>::value)
    r += " const";
  if (std::is_volatile<TR>::value)
    r += " volatile";
  if (std::is_lvalue_reference<T>::value)
    r += " &amp;&";
  else if (std::is_rvalue_reference<T>::value)
    r += " &amp;&amp;";
  return r;
}

以上是回调在 C 中如何工作,以及它们的各种用途是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn