面试题答案
一键面试#include <iostream>
#include <typeinfo>
#include <string>
#include <cstdlib>
#include <cxxabi.h>
// 辅助函数,用于处理typeid.name()返回值的格式
std::string demangle(const char* name) {
int status;
char* demangled = abi::__cxa_demangle(name, nullptr, nullptr, &status);
std::string result = (status == 0)? demangled : name;
std::free(demangled);
return result;
}
// 递归终止模板
template <typename T>
void printTypes(T t) {
std::cout << demangle(typeid(t).name());
}
// 递归展开模板
template <typename T, typename... Args>
void printTypes(T t, Args... args) {
std::cout << demangle(typeid(t).name()) << ", ";
printTypes(args...);
}
你可以使用以下方式调用:
int main() {
printTypes(1, 'a', 3.14);
return 0;
}
这段代码定义了一个 printTypes
函数模板,它可以接受可变数量的参数,并打印出每个参数的类型名称。demangle
函数用于处理不同编译器下 typeid.name()
返回值格式不同的问题,将其转换为更易读的形式。在 main
函数中展示了对 printTypes
的调用。