MST

星途 面试题库

面试题:C++ 模板元编程之类型序列处理

实现一个模板元编程工具,能够在编译期对类型序列进行操作。给定一个类型序列 `Typelist<int, double, std::string>`,编写模板函数实现以下功能:1. 过滤出所有整数类型;2. 将所有类型转换为其指针类型;3. 计算类型序列的长度。
15.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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

// 定义类型列表模板
template <typename... Ts>
struct Typelist {};

// 过滤出整数类型
template <typename T, typename... Ts>
struct FilterIntegral;

template <typename... Ts>
struct FilterIntegral<Typelist<>, Ts...> {
    using type = Typelist<>;
};

template <typename T, typename... Ts, typename... Rest>
struct FilterIntegral<Typelist<T, Ts...>, Rest...> {
    using type = std::conditional_t<
        std::is_integral<T>::value,
        typename FilterIntegral<Typelist<Ts...>, Rest..., T>::type,
        typename FilterIntegral<Typelist<Ts...>, Rest...>::type
    >;
};

// 将所有类型转换为指针类型
template <typename T, typename... Ts>
struct ToPointer;

template <typename... Ts>
struct ToPointer<Typelist<>, Ts...> {
    using type = Typelist<>;
};

template <typename T, typename... Ts, typename... Rest>
struct ToPointer<Typelist<T, Ts...>, Rest...> {
    using type = typename ToPointer<Typelist<Ts...>, Rest..., T*>::type;
};

// 计算类型序列的长度
template <typename T>
struct Length;

template <typename... Ts>
struct Length<Typelist<Ts...>> {
    static const size_t value = sizeof...(Ts);
};


int main() {
    using MyTypelist = Typelist<int, double, std::string>;

    // 过滤出整数类型
    using FilteredTypelist = typename FilterIntegral<MyTypelist>::type;
    static_assert(std::is_same<FilteredTypelist, Typelist<int>>::value, "FilterIntegral failed");

    // 将所有类型转换为指针类型
    using PointerTypelist = typename ToPointer<MyTypelist>::type;
    static_assert(std::is_same<PointerTypelist, Typelist<int*, double*, std::string*>>::value, "ToPointer failed");

    // 计算类型序列的长度
    static_assert(Length<MyTypelist>::value == 3, "Length failed");

    return 0;
}
  1. 过滤整数类型
    • FilterIntegral 模板递归处理类型列表,使用 std::is_integral 判断当前类型是否为整数类型,如果是则保留在结果类型列表中,否则跳过。
  2. 转换为指针类型
    • ToPointer 模板递归处理类型列表,将每个类型转换为指针类型并构建新的类型列表。
  3. 计算长度
    • Length 模板使用 sizeof... 运算符获取类型列表中类型的数量。

main 函数中,通过 static_assert 对实现的功能进行验证。