MST

星途 面试题库

面试题:C++可变参数模板在类型处理中的应用

假设有一个函数模板printTypes,它接受可变参数模板,要求该函数能够在控制台打印出每个参数的类型名称。例如,调用printTypes(1, 'a', 3.14),输出类似:int, char, double。请实现这个函数,你可以使用typeid.name()获取类型名称,但要处理不同编译器下该函数返回值格式不同的情况。
36.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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 的调用。