面试题答案
一键面试#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;
}
- 递归终止模板特化:
template <typename T> std::vector<T> processArgs(T arg)
是递归终止的基本情况,它接受一个参数并将其放入std::vector
中返回。
- 类型特定处理:
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
中返回。
- 可变参数模板递归展开:
template <typename T, typename... Args> std::vector<typename std::common_type<T, Args...>::type> processArgs(T arg, Args... args)
递归调用processArgs
处理每个参数,并将结果合并到一个std::vector
中返回。
main
函数:- 展示了如何调用
processArgs
函数模板,传递不同类型的参数,并输出处理后的结果。
- 展示了如何调用
请注意,这里使用 std::common_type
来确定返回 std::vector
的类型,这在不同类型参数有共同可转换类型时有效。如果参数类型差异较大无法确定共同类型,可能需要更复杂的处理方式。