当前位置:   article > 正文

C++中把Lambda 表达式作为参数传递给模板函数。

C++中把Lambda 表达式作为参数传递给模板函数。

例子:

  1. template<class fun>
  2. void mytest(fun f)
  3. {
  4. _string s1 = "abc";
  5. _string s2 = "abc";
  6. if (f(s1, s2))
  7. {
  8. std::cout << "相等。\n";
  9. }
  10. }
  11. int main()
  12. {
  13. mytest([](const _string s1, const _string& s2) { return s1 == s2; });
  14. return 0;
  15. }

输出:

下面是模拟C++标准库的应用:

  1. #include "X:\Work\Share\CCode\CPlatform\MathExt\_MathExt_out.h"
  2. using namespace lf;
  3. using namespace std;
  4. int main()
  5. {
  6. std::string s1 = "abcd1111";
  7. s1.erase(std::find_if(s1.rbegin(), s1.rend(), [](char ch) { return ch != '1'; }).base(), s1.end());
  8. _string s2 = "abcd1111";
  9. s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(), [](char ch) { return ch != '1'; }).std_base(), s2.end());
  10. std::cout << "s1=" << s1 << "\n";
  11. _pcn(s2);
  12. }

输出:

代码:

  1. /*******************************************************************************************
  2. 文件名 : _xutility.h
  3. 作者 : 李锋
  4. 功能 : 模拟 <xutility>
  5. 创建时间 : 2024年04月21日
  6. 最后一次修改时间 : 2024年04月21日
  7. ********************************************************************************************/
  8. #pragma once;
  9. #include "_Macro.h"
  10. _LF_BEGIN_
  11. /*
  12. _EXPORT_STD template <class _Category, class _Ty, class _Diff = ptrdiff_t, class _Pointer = _Ty*,
  13. class _Reference = _Ty&>
  14. struct _CXX17_DEPRECATE_ITERATOR_BASE_CLASS iterator { // base type for iterator classes
  15. using iterator_category = _Category; //表示迭代器的类别,例如输入、输出、前向、双向或随机访问等。
  16. using value_type = _Ty; //表示迭代器所指向元素的类型。
  17. using difference_type = _Diff; //表示迭代器之间的差值类型,默认为ptrdiff_t。
  18. using pointer = _Pointer; //表示迭代器所指向元素的指针类型。
  19. using reference = _Reference; //表示迭代器所指向元素的引用类型。
  20. };
  21. _CXX17_DEPRECATE_ITERATOR_BASE_CLASS是一个宏定义,用于在C++17中标记迭代器基类
  22. (如std::iterator)的弃用。这个宏定义通常用于告知开发者,该迭代器基类在未来的版
  23. 本中可能会被移除或更改,建议使用其他替代方案。
  24. _EXPORT_STD是一个宏定义,通常用于在标准库的头文件中。它的作用是在编译时将一些符号标记为导出(export),
  25. 以便在其他模块中使用。这样做的目的是避免在链接时出现重复定义的错误。然而,这个宏在C++17中已经被移除,
  26. 因为它与模块化的支持有关,而模块化在C++17中并未完全实现。
  27. */
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. /// <typeparam name="T"></typeparam>
  32. /// <typeparam name="Isbackward"></typeparam>
  33. /// <typeparam name="Step"></typeparam>
  34. /// 创建时间:2024-04-21 最后一次修改时间:2024-04-21
  35. template <typename T, size_t Step = 1, bool Isbackward = true>
  36. class _iterator_base {
  37. public:
  38. T* _pt;
  39. public:
  40. inline _iterator_base(const T* pt) : _pt((T*)pt) {}
  41. public:
  42. /// <summary>
  43. /// 类型转换
  44. /// </summary>
  45. inline operator const T* () const { return _pt; }
  46. /// <summary>
  47. /// 前置加加
  48. /// </summary>
  49. /// <returns></returns>
  50. _iterator_base& operator++() {//效率高
  51. if (Isbackward)
  52. _pt = _pt + Step;
  53. else
  54. _pt = _pt - Step;
  55. return *this;
  56. }
  57. /// <summary>
  58. /// 后置加加
  59. /// </summary>
  60. /// <param name=""></param>
  61. /// <returns></returns>
  62. _iterator_base operator++(int) {
  63. _iterator_base oldvalue = *this;
  64. if (Isbackward)
  65. _pt = _pt + Step;
  66. else
  67. _pt = _pt - Step;
  68. return oldvalue;
  69. }
  70. /// <summary>
  71. /// 前置减减
  72. /// </summary>
  73. /// <returns></returns>
  74. inline _iterator_base& operator--() {
  75. if (Isbackward)
  76. _pt = _pt - Step;
  77. else
  78. _pt = _pt + Step;
  79. return *this;
  80. }
  81. /// <summary>
  82. /// 后置减减
  83. /// </summary>
  84. /// <param name=""></param>
  85. /// <returns></returns>
  86. _iterator_base operator--(int)
  87. {
  88. _iterator_base oldvalue = *this;
  89. if (Isbackward)
  90. _pt = _pt - Step;
  91. else
  92. _pt = _pt + Step;
  93. }
  94. inline bool operator==(const _iterator_base& right) {
  95. return _pt == right._pt;
  96. }
  97. inline bool operator<(const _iterator_base& right) {
  98. if (Isbackward)
  99. return _pt < right._pt;
  100. else
  101. return _pt > right._pt;
  102. }
  103. inline bool operator<=(const _iterator_base& right) {
  104. if (Isbackward)
  105. return _pt <= right._pt;
  106. else
  107. return _pt >= right._pt;
  108. }
  109. inline bool operator>(const _iterator_base& right) {
  110. if (Isbackward)
  111. return _pt > right._pt;
  112. else
  113. return _pt < right._pt;
  114. }
  115. // 解引用操作符重载
  116. inline const T& operator*() const{ return *_pt; }
  117. /*
  118. // 获取原始指针的操作符重载
  119. T* operator->() const {
  120. return _pt;
  121. }
  122. */
  123. inline const T* std_base() { return _pt; }
  124. };
  125. template <typename T>
  126. class _iterator : public _iterator_base<T,1,true>
  127. {
  128. public:
  129. inline _iterator(const T* pt) : _iterator_base<T, 1, true>(pt) {}
  130. };
  131. template <typename T>
  132. class _reverse_iterator : public _iterator_base<T, 1, false>
  133. {
  134. public:
  135. inline _reverse_iterator(const T* pt) : _iterator_base<T, 1, false>(pt) { }
  136. };
  137. /// <summary>
  138. /// 模拟std::find_if
  139. /// </summary>
  140. /// <typeparam name="T"></typeparam>
  141. /// <typeparam name="fun"></typeparam>
  142. /// <param name="first"></param>
  143. /// <param name="last"></param>
  144. /// <param name="pred"></param>
  145. /// <returns></returns>
  146. /// 创建时间:2024-04-21 最后一次修改时间:2024-04-22
  147. template <class T, class fun>
  148. _reverse_iterator<T> _find_if(const _reverse_iterator<T>& first,
  149. const _reverse_iterator<T>& last, fun pred) {
  150. /* 用法
  151. std::string s1 = "0abc023030000";
  152. s1.erase(std::find_if(s1.rbegin(), s1.rend(),
  153. [](char ch) { return ch != '0'; }).base(), s1.end());
  154. std::cout << "s1=" << s1 << "\n";
  155. _string s2 = _t("0abc023030000");
  156. s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(),
  157. [](wchar_t ch) { return ch != _t('0'); }).std_base(), s2.std_end());
  158. std::wcout << _t("s2=") << s2 << _t("\n");
  159. */
  160. _reverse_iterator<T> itStart = first;
  161. ++itStart;
  162. for (; itStart <= last; itStart++) {
  163. if (pred(*itStart)) {
  164. return itStart + 1; //符合条件字符串的下一位置。
  165. }
  166. }
  167. return last;
  168. }
  169. _LF_END_

_string中的代码:

  1. /// <summary>
  2. /// 模拟std::string::erase
  3. /// </summary>
  4. /// <param name="first"></param>
  5. /// <param name="last"></param>
  6. /// <returns></returns>
  7. /// 创建时间: 2024-04-21 最后一次修改时间:2024-04-22
  8. _Str<T>& std_erase(const _iterator<T>& first, const _iterator<T>& last) {
  9. /*
  10. std::string s1 = "0abc023030000";
  11. s1.erase(std::find_if(s1.rbegin(), s1.rend(),
  12. [](char ch) { return ch != '0'; }).base(), s1.end());
  13. std::cout << "s1=" << s1 << "\n";
  14. _string s2 = _t("0abc023030000");
  15. s2.std_erase(lf::_find_if(s2.std_rbegin(), s2.std_rend(),
  16. [](wchar_t ch) { return ch != _t('0'); }).std_base(), s2.std_end());
  17. std::wcout << _t("s2=") << s2 << _t("\n");
  18. */
  19. _Str<T> tmp(_t(""), _nLength);
  20. const T* pf = first;
  21. T* pl = (T*)(const T*)last;
  22. int n = pf - _pData;
  23. //拷贝前半部分
  24. if (n > 0){
  25. for (int i = 0; i < n; ++i){
  26. tmp.Add(*(_pData + i));
  27. }
  28. }
  29. ++pl;
  30. //拷贝后半部分
  31. while (*pl) {
  32. tmp.Add(*pl);
  33. ++pl;
  34. }
  35. //清除字符,注意,在这里不要清除内存
  36. this->Clear();
  37. this->Add(tmp); //拷贝进来
  38. return *this;
  39. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/519598
推荐阅读
相关标签
  

闽ICP备14008679号