MST

星途 面试题库

面试题:C++函数指针在复杂模板与多态场景下的运用

设计一个模板类,其中包含一个成员函数指针类型的成员变量。该模板类接受一个类型参数T。编写一个函数,它接受一个该模板类的对象作为参数,并且根据对象中存储的函数指针类型,以多态的方式调用不同的函数来处理类型为T的数据。在主函数中实例化不同类型参数的模板类对象,并调用上述函数展示多态行为。
24.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 模板类定义
template <typename T>
class FunctionHolder {
public:
    // 成员函数指针类型的成员变量
    void (*func)(T);

    // 构造函数,初始化函数指针
    FunctionHolder(void (*f)(T)) : func(f) {}

    // 调用函数指针
    void execute(T data) {
        if (func) {
            func(data);
        }
    }
};

// 不同类型的处理函数
void processInt(int num) {
    std::cout << "Processing integer: " << num << std::endl;
}

void processDouble(double num) {
    std::cout << "Processing double: " << num << std::endl;
}

// 以多态的方式调用函数的函数
template <typename T>
void callFunction(FunctionHolder<T>& holder, T data) {
    holder.execute(data);
}

int main() {
    // 实例化不同类型参数的模板类对象
    FunctionHolder<int> intHolder(processInt);
    FunctionHolder<double> doubleHolder(processDouble);

    // 调用函数展示多态行为
    callFunction(intHolder, 42);
    callFunction(doubleHolder, 3.14);

    return 0;
}
  1. 模板类 FunctionHolder
    • 包含一个成员函数指针 func,它可以指向一个接受类型为 T 参数并返回 void 的函数。
    • 构造函数用于初始化这个函数指针。
    • execute 成员函数调用存储的函数指针(如果它不为空)。
  2. 处理函数
    • processInt 用于处理 int 类型的数据。
    • processDouble 用于处理 double 类型的数据。
  3. callFunction 函数
    • 这是一个模板函数,接受一个 FunctionHolder<T> 对象和类型为 T 的数据,通过调用 holder.execute(data) 以多态的方式调用不同的函数来处理数据。
  4. main 函数
    • 实例化了 FunctionHolder<int>FunctionHolder<double> 对象,并分别传入对应的处理函数。
    • 调用 callFunction 函数来展示多态行为,分别处理 intdouble 类型的数据。