面试题答案
一键面试#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;
}
- 过滤整数类型:
FilterIntegral
模板递归处理类型列表,使用std::is_integral
判断当前类型是否为整数类型,如果是则保留在结果类型列表中,否则跳过。
- 转换为指针类型:
ToPointer
模板递归处理类型列表,将每个类型转换为指针类型并构建新的类型列表。
- 计算长度:
Length
模板使用sizeof...
运算符获取类型列表中类型的数量。
在 main
函数中,通过 static_assert
对实现的功能进行验证。