#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;
}
- 类型序列模板
TypeList
:用于定义类型序列。
- 插入类型模板
InsertType
:将指定类型插入到类型序列的开头。
- 删除类型模板
RemoveType
:从类型序列中删除指定类型。
- 获取特定位置类型模板
GetTypeAt
:获取类型序列中指定位置的类型。
- 函数模板
createObject
:接受一个类型序列和索引值,返回该索引位置类型对应的默认构造对象。