从vs2022 STL实现看 模板禁用enable_if的代替形式

文章探讨了C++中利用模板元编程进行迭代器检测的技术,通过SFINAE原则和void_t技巧来判断一个类型是否是迭代器。同时展示了如何测试类是否具有特定成员类型。示例代码中,`my_Is_iterator_v`模板和`TypeTest`结构体分别用于检测迭代器和检查类成员。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<string>
#include<vector>
using namespace std;

template <class _Ty, class = void>
_INLINE_VAR constexpr bool my_Is_iterator_v = false;

template <class _Ty>
_INLINE_VAR constexpr bool my_Is_iterator_v<_Ty, void_t<_Iter_cat_t<_Ty>>> = true;

//vs C++20 标准库的实现 经常使用主模板的默认模板参数 void 特化到 偏特化模板版本,在偏特化版本中使用void_t接受任意模板参数
//通常是用于前面的模板参数有关的一些实例化推导,结合SFINA原则;如果推导失败,放弃特化版本;选用最开始的主模板
//以这种方式代替模板禁用 enable_if


template <class, class = void>
struct TypeTest {};

template <class Person>
struct TypeTest<Person, void_t<typename Person::Name>> {
	using TYPE = Person;
};
class per
{
public:
	using Name = int;
};

int main()
{
//!	TypeTest<int>::TYPE;
	TypeTest<per>::TYPE;


	_Is_iterator_v<int>;
	_Is_iterator_v<int*>;
//!	_Iter_cat_t<int>;
	_Iter_cat_t<int*>;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值