MST
星途 面试题库

面试题:C++ 函数指针在模板元编程中的高级应用

在 C++ 模板元编程中,函数指针可以发挥独特的作用。请设计一个基于模板元编程的场景,使用函数指针来实现编译期的算法选择。例如,假设有两个不同的排序算法 `void sort1(int* arr, int size)` 和 `void sort2(int* arr, int size)`,通过模板元编程和函数指针,实现在编译期根据数组大小选择更合适的排序算法进行调用。请详细说明设计思路并给出完整代码实现。
34.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 首先定义两个排序函数 sort1sort2
  2. 使用模板元编程的方式,根据数组大小在编译期选择合适的排序函数。这可以通过模板特化来实现。
  3. 定义一个模板类,其中包含一个函数指针成员变量,根据不同的数组大小模板特化选择不同的排序函数赋值给该函数指针。
  4. 提供一个调用函数,通过该函数指针来调用选择好的排序函数。

完整代码实现

#include <iostream>

// 第一个排序算法
void sort1(int* arr, int size) {
    // 简单的冒泡排序示例
    for (int i = 0; i < size - 1; ++i) {
        for (int j = 0; j < size - i - 1; ++j) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 第二个排序算法
void sort2(int* arr, int size) {
    // 简单的选择排序示例
    for (int i = 0; i < size - 1; ++i) {
        int minIndex = i;
        for (int j = i + 1; j < size; ++j) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

// 模板类用于在编译期选择排序算法
template <int size>
class SortSelector {
public:
    using SortFunc = void(*)(int*, int);
    static SortFunc getSortFunction() {
        // 根据数组大小选择排序算法,这里假设size > 10 用sort2,否则用sort1
        return size > 10? sort2 : sort1;
    }
};

// 调用排序函数
template <int size>
void sortArray(int* arr) {
    SortSelector<size>::SortFunc func = SortSelector<size>::getSortFunction();
    func(arr, size);
}

int main() {
    int arr1[5] = {5, 4, 3, 2, 1};
    int arr2[15] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};

    sortArray<5>(arr1);
    sortArray<15>(arr2);

    std::cout << "Sorted arr1: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << arr1[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "Sorted arr2: ";
    for (int i = 0; i < 15; ++i) {
        std::cout << arr2[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}