21xrx.com
2025-04-02 18:25:58 Wednesday
文章检索 我的文章 写文章
C++模板函数指针和容器的使用
2023-06-27 13:06:42 深夜i     7     0
C++ 模板函数 指针 容器 使用

C++作为一门多范式编程语言,在模板方面有着很强的支持,其中包括函数模板和类模板两种。函数模板是指可以在一个函数中定义一套可重用的代码,以支持多种类型的操作。而指针是C++中常用的一种数据结构,指针可以指向任何类型的数据,包括函数。结合使用函数模板和函数指针,可以实现在容器中存储一组可以处理多种类型的函数指针。

1. 函数模板和函数指针的声明

在C++中,函数模板的声明方式如下:

template <typename T>
void function_name(T t);

而函数指针的声明方式如下:

return_type (*function_pointer_name) (parameters)

将函数指针作为函数模板的参数,可以实现在函数模板中对不同类型的函数进行操作。例如,以下代码中,函数模板`function_template` 可以指向任何返回`int`类型,参数为`int`和`double`的函数,其中参数`func_pointer`为函数指针类型:

#include <iostream>
template<typename FUNC_TYPE>
int function_template(FUNC_TYPE func_pointer, int input1, double input2)
{
  return func_pointer(input1, input2);
}
int add(int a, double b)
{
  return a + b;
}
int subtract(int a, double b)
  return a - b;
int main()
{
  std::cout << function_template(add, 5, 2.4) << std::endl; // 7
  std::cout << function_template(subtract, 5, 2.4) << std::endl; // 2
  return 0;
}

2. 函数模板和容器的使用

使用函数模板和函数指针可以实现在容器中存储一组可以处理多种类型的函数指针。其中,C++中的`std::function`是一种通用的函数封装类,可以用来存储任何可调用对象,包括函数、函数指针、Lambda表达式等。

以下代码演示了如何使用`std::function`和函数模板实现储存可以处理多种类型的函数指针的容器:

#include <iostream>
#include <vector>
#include <functional>
template<typename FUNC_TYPE>
int function_template(FUNC_TYPE func_pointer, int input1, double input2)
{
  return func_pointer(input1, input2);
}
int add(int a, double b)
{
  return a + b;
}
int subtract(int a, double b)
  return a - b;
int main()
{
  std::vector<std::function<int(int, double)>> function_vector;
  function_vector.push_back(add);
  function_vector.push_back(subtract);
  for (const auto& f : function_vector) {
    std::cout << f(5, 2.4) << std::endl;
  }
  return 0;
}

运行结果为:

7
2

3. 总结

使用函数模板和函数指针可以实现通过容器存储可以处理多种类型的函数指针。同时,`std::function`是一种通用的函数封装类,可以用来存储任何可调用对象。这些特性为C++中的泛型编程提供了强有力的支持,并在编写模块化、可重用的代码时发挥着重要作用。

  
  

评论区