MST

星途 面试题库

面试题:C++可变参数模板递归展开在类型处理上的应用

编写一个C++函数模板,使用可变参数模板的递归展开,接受任意数量的不同类型参数,对每个参数执行不同的类型特定操作(例如对整数加1,对字符串拼接一个后缀),并将处理后的结果存储在一个`std::vector`中返回。你需要处理至少三种不同的类型。
36.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <string>

// 递归终止模板特化
template <typename T>
std::vector<T> processArgs(T arg) {
    std::vector<T> result;
    result.push_back(arg);
    return result;
}

// 处理整数类型
template <>
std::vector<int> processArgs(int arg) {
    std::vector<int> result;
    result.push_back(arg + 1);
    return result;
}

// 处理字符串类型
template <>
std::vector<std::string> processArgs(const std::string& arg) {
    std::vector<std::string> result;
    result.push_back(arg + "_suffix");
    return result;
}

// 可变参数模板递归展开
template <typename T, typename... Args>
std::vector<typename std::common_type<T, Args...>::type> processArgs(T arg, Args... args) {
    auto subResult = processArgs(arg);
    auto restResult = processArgs(args...);
    std::vector<typename std::common_type<T, Args...>::type> result;
    result.reserve(subResult.size() + restResult.size());
    result.insert(result.end(), subResult.begin(), subResult.end());
    result.insert(result.end(), restResult.begin(), restResult.end());
    return result;
}

你可以这样调用这个函数模板:

int main() {
    auto result = processArgs(1, "hello", 2.5f);
    for (const auto& item : result) {
        std::cout << item << std::endl;
    }
    return 0;
}
  1. 递归终止模板特化
    • template <typename T> std::vector<T> processArgs(T arg) 是递归终止的基本情况,它接受一个参数并将其放入 std::vector 中返回。
  2. 类型特定处理
    • template <> std::vector<int> processArgs(int arg) 专门处理 int 类型,将整数加1后放入 std::vector 中返回。
    • template <> std::vector<std::string> processArgs(const std::string& arg) 专门处理 std::string 类型,拼接后缀 _suffix 后放入 std::vector 中返回。
  3. 可变参数模板递归展开
    • template <typename T, typename... Args> std::vector<typename std::common_type<T, Args...>::type> processArgs(T arg, Args... args) 递归调用 processArgs 处理每个参数,并将结果合并到一个 std::vector 中返回。
  4. main 函数
    • 展示了如何调用 processArgs 函数模板,传递不同类型的参数,并输出处理后的结果。

请注意,这里使用 std::common_type 来确定返回 std::vector 的类型,这在不同类型参数有共同可转换类型时有效。如果参数类型差异较大无法确定共同类型,可能需要更复杂的处理方式。