自己做TypeList编写的测试Demo

本文介绍了一个使用C++模板元编程实现的TypeListDemo,演示了如何处理类型列表的各种操作,如获取长度、索引查找、追加和删除等。通过一系列的测试验证了这些元编程技巧的有效性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己编写的TypeListDemo,不错很好玩的东西
#include <iostream>
#include <cassert>
#include <cstring>
using namespace std;

struct NullType {};

template<class Head, class Tail>
struct TypeList
{
	typedef Head HeadType;
	typedef Tail TailType;
};

//仅仅声明,不实现
 template<class TList>
 struct Length;
 
 template<>
 struct Length<NullType>
 {
 	static enum {value = 0,};
 };
 
 template<class Head, class Tail >
 struct Length<TypeList<Head, Tail> >
 {
 	static enum { value = 1 + Length<Tail>::value, };
 };

 template<class, unsigned int> struct TypeAt;
 template<class T, class U>
 struct TypeAt<TypeList<T, U> , 0>
 {
	 typedef T ResultType;
 };

 template<unsigned int index>
 struct TypeAt<NullType, index>
 {
	 typedef NullType ResultType;
 };

 template<class T, class U, unsigned int index>
 struct TypeAt<TypeList<T, U>, index>
 {
	 typedef typename TypeAt<U, index -1>::ResultType ResultType;
 };

 template <class, class> struct IndexOf;
 template<class Head, class Tail>
 struct IndexOf<TypeList<Head, Tail>, NullType>
 {
	 static enum {value = -1,};
 };

 template<class Head, class Tail>
 struct IndexOf<TypeList<Head, Tail>, Head>
 {
	 static enum{value = 0,};
 };

 template<class T>
 struct IndexOf<NullType, T>
 {
	 static enum {value = -1,};
 };

 template<class Head, class Tail, class T>
 struct IndexOf<TypeList<Head, Tail>, T>
 {
	 static enum {tmpvalue = IndexOf<Tail, T>::value ,};
	 static enum {value = (tmpvalue== -1) ? -1:(tmpvalue+1),};
 };

 template<class, class> struct Append;
 template<class Head, class Tail>
 struct Append<TypeList<Head, Tail>, NullType>
 {
	 typedef NullType ResultType;
 };

 template<class T>
 struct Append<NullType, T>
 {
	 typedef TypeList<T, NullType> ResultType;
 };

 template<class Head, class Tail, class T>
 struct Append<TypeList<Head, Tail>, T>
 {
	 typedef TypeList<Head, typename Append<Tail, T>::ResultType> ResultType;
 };

 template<class, class> struct Erase;
 template<class Head, class Tail>
 struct Erase<TypeList<Head, Tail>, NullType>
 {
	 typedef TypeList<Head, Tail> ResultType;
 };

 template<class T>
 struct Erase<NullType, T>
 {
	 typedef NullType ResultType;
 };

 template<class Head, class Tail>
 struct Erase<TypeList<Head, Tail>, Head>
 {
	 typedef Tail ResultType;
 };

 template<class Head, class Tail, class T>
 struct Erase<TypeList<Head, Tail>, T>
 {
	 typedef typename Erase<Tail, T>::ResultType ResultType;
 };

 template<class T, class U>
 struct IsSame
 {
	 static enum {value = false,};
 };

 template<class T>
 struct IsSame<T, T>
 {
	 static enum {value = true,};
 };

void length_test()
{
	typedef TypeList<int, TypeList<double, TypeList<char, NullType>>> ThreeTypeList;
	assert(Length<ThreeTypeList>::value == 3);

	typedef  TypeAt<ThreeTypeList, 0>::ResultType IntType;
	typedef  TypeAt<ThreeTypeList, 1>::ResultType DoubleType;
	
	int s1 = IsSame<TypeAt<ThreeTypeList, 10000>::ResultType , NullType>::value;

	bool b1 = std::is_same<int, IntType>::value ;
	bool b2 = std::is_same<double, DoubleType>::value;

	assert((IndexOf<ThreeTypeList, int>::value == 0));
	assert((IndexOf<ThreeTypeList,double>::value == 1));
	assert((IndexOf<ThreeTypeList, char>::value == 2));
	assert((IndexOf<ThreeTypeList, NullType>::value == -1));
	assert((IndexOf<ThreeTypeList, std::string>::value == -1));

	typedef Append<ThreeTypeList, double>::ResultType FourTypeList;
	int len = Length<FourTypeList>::value;
	int v1 = IsSame<TypeAt<FourTypeList, 0>::ResultType, int>::value;
	int v2 = IsSame<TypeAt<FourTypeList, 1>::ResultType, double>::value;
	int v3 = IsSame<TypeAt<FourTypeList, 2>::ResultType, char>::value;
	int v4 = IsSame<TypeAt<FourTypeList, 3>::ResultType, double>::value;

	typedef Erase<FourTypeList, int>::ResultType DCDType;
	int e1 = IsSame<TypeAt<DCDType, 0>::ResultType, double>::value;
	int e2 = IsSame<TypeAt<DCDType, 1>::ResultType, char>::value;
	int e3 = IsSame<TypeAt<DCDType, 2>::ResultType, double>::value;

	std::cout<<typeid(DoubleType).name()<<std::endl;

	int aaa = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	length_test();

	char c = getchar();
	return 0;
}




### 使用 MyBatis Plus 和 MySQL 的演示示例 #### 创建数据库表结构 为了展示 MyBatis-Plus 的强大功能,可以先创建一个名为 `users` 的 SQL 表并添加必要的字段[^1]。 ```sql CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT, email VARCHAR(255) ); ``` 此表格用于存储用户信息,包括用户的 ID、姓名、年龄以及电子邮件地址。 #### 配置 Maven 依赖项 在项目的 pom.xml 文件中加入 MyBatis-Plus 及其相关组件的依赖关系: ```xml <dependencies> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- JUnit Jupiter API and Engine for testing --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> </dependencies> ``` 这段配置引入了 MyBatis-Plus 和 MySQL 连接器作为主要开发工具,并集成了最新版本的 JUnit 测试框架来编写单元测试案例[^2]。 #### 编写实体类与 Mapper 接口 定义一个 Java 实体类代表上述创建的数据模型——User.java: ```java package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; @Data public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; } ``` 接着建立对应的 Mapper 接口继承 BaseMapper 基础接口实现 CRUD 操作 —— IUserMapper.java : ```java package com.example.demo.mapper; import org.apache.ibatis.annotations.Mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; @Mapper public interface IUserMapper extends BaseMapper<User> {} ``` 以上代码片段展示了如何利用 Lombok 库简化 getter/setter 方法书写过程;同时通过注解方式指定了主键自增策略[@Data][^3]. #### 单元测试验证数据访问层逻辑 最后,在 test 路径下新建 TestUserService 类来进行简单查询操作检验: ```java package com.example.demo.service.impl; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; import javax.annotation.Resource; import org.junit.jupiter.api.Test; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.IUserMapper; class UserServiceTest { @Resource private IService<User> userService; @Test void contextLoads() throws Exception { List<User> userList = userService.list(); assertThat(userList).isNotNull().hasSize(5); System.out.println("Result:"); for (var user : userList) { System.out.println(user.toString()); } } } ``` 运行该测试方法将会打印出如下结果[^4]: ``` Result: User{id=1, name='Jone', age=18, email='test1@baomidou.com'} User{id=2, name='Jack', age=20, email='test2@ba⚗📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐📐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值