MST

星途 面试题库

面试题:C++可变参数模板的复杂元编程

实现一个C++元编程工具,利用可变参数模板和参数包操作,创建一个类型序列(TypeList)。要求能够实现向序列中插入类型、删除类型、获取特定位置类型等操作。同时,利用这个TypeList实现一个函数模板,它接受一个TypeList和一个索引值,返回该索引位置类型对应的默认构造对象。例如,对于TypeList<int, float, double>,传入索引1,返回一个默认构造的float对象。
33.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 类型序列模板
template <typename... Ts>
struct TypeList {};

// 向类型序列中插入类型
template <typename T, typename... Ts>
struct InsertType;

template <typename T, typename Head, typename... Tail>
struct InsertType<T, Head, Tail...> {
    using type = TypeList<T, Head, Tail...>;
};

// 删除类型
template <typename T, typename... Ts>
struct RemoveType;

template <typename T, typename Head, typename... Tail>
struct RemoveType<T, Head, Tail...> {
    using type = typename std::conditional<
        std::is_same<T, Head>::value,
        TypeList<Tail...>,
        TypeList<Head, typename RemoveType<T, Tail...>::type...>
    >::type;
};

// 获取特定位置类型
template <size_t N, typename... Ts>
struct GetTypeAt;

template <size_t N, typename Head, typename... Tail>
struct GetTypeAt<N, Head, Tail...> {
    using type = typename std::conditional<
        N == 0,
        Head,
        typename GetTypeAt<N - 1, Tail...>::type
    >::type;
};

// 函数模板,返回索引位置类型对应的默认构造对象
template <size_t N, typename... Ts>
typename GetTypeAt<N, Ts...>::type createObject(TypeList<Ts...>) {
    return typename GetTypeAt<N, Ts...>::type();
}

int main() {
    using MyTypeList = TypeList<int, float, double>;

    // 插入类型
    using NewTypeList = typename InsertType<char, MyTypeList>::type;

    // 删除类型
    using RemovedTypeList = typename RemoveType<float, MyTypeList>::type;

    // 获取特定位置类型并创建对象
    float f = createObject<1>(MyTypeList());

    std::cout << "默认构造的float值: " << f << std::endl;

    return 0;
}
  1. 类型序列模板 TypeList:用于定义类型序列。
  2. 插入类型模板 InsertType:将指定类型插入到类型序列的开头。
  3. 删除类型模板 RemoveType:从类型序列中删除指定类型。
  4. 获取特定位置类型模板 GetTypeAt:获取类型序列中指定位置的类型。
  5. 函数模板 createObject:接受一个类型序列和索引值,返回该索引位置类型对应的默认构造对象。