MST

星途 面试题库

面试题:C++可变参数模板实现类型序列操作

请使用C++可变参数模板实现一个类型序列(type sequence),要求能够在编译期对类型序列进行一些操作,例如获取序列中第N个类型。假设类型序列通过可变参数模板类定义如下: ```cpp template<typename... Types> struct TypeSequence { }; ``` 请给出具体实现代码,并说明如何使用这个类型序列获取第N个类型。
41.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 定义类型序列
template<typename... Types>
struct TypeSequence { };

// 辅助结构体,用于获取第N个类型
template<size_t N, typename... Types>
struct GetTypeAt;

// 偏特化版本,当N为0时,返回第一个类型
template<typename Head, typename... Tail>
struct GetTypeAt<0, Head, Tail...> {
    using type = Head;
};

// 递归偏特化版本,N > 0时,从剩余类型中获取第N - 1个类型
template<size_t N, typename Head, typename... Tail>
struct GetTypeAt<N, Head, Tail...> {
    using type = typename GetTypeAt<N - 1, Tail...>::type;
};


int main() {
    // 定义一个类型序列
    using MyTypeSequence = TypeSequence<int, float, double, char>;

    // 获取第2个类型(从0开始计数)
    using SecondType = typename GetTypeAt<2, int, float, double, char>::type;

    SecondType value = 3.14; // 这里SecondType是double
    std::cout << value << std::endl;

    return 0;
}

使用说明

  1. 定义类型序列:通过TypeSequence<int, float, double, char>这样的方式定义一个类型序列。
  2. 获取第N个类型:使用GetTypeAt<N, Types...>::type的方式获取类型序列中的第N个类型,其中N是从0开始计数的索引,Types...是类型序列中的所有类型。例如GetTypeAt<2, int, float, double, char>::type会获取到double类型。在实际使用中,可以像示例代码那样先定义一个类型序列别名,然后再使用GetTypeAt获取指定位置的类型。