C++ enable_if

目录

is_integral_v

is_same_v

enable_if

enable_if实现条件编译

应用示例:UpperType


is_integral_v

is_integral_v判断一个类型是不是整型

is_same_v

is_same_v判断两个类型是不是相同的类型

enable_if

enable_if就是通过模板偏特化实现重载,从而用来控制参数类型。

自定义版本:

template<typename T, bool flag>
struct enable {
	//
};
template<typename T>
struct enable<T, true> {
	typedef T type;
};

template<typename T>
typename enable < string, is_integral_v<T>>::type ToString(T t)
{
	return to_string(t);
}

int main()
{
	cout << ToString(123);
	//cout << ToString("123"); //编译失败
	return 0;
}

ToString函数只接受整数类型的参数,否则会编译报错type。

使用库的版本:

template<typename T>
typename enable_if<is_integral_v<T>, string>::type ToString(T t)
{
	return to_string(t);
}

int main()
{
	cout << ToString(123);
	//cout << ToString("123"); //编译失败
	return 0;
}

enable_if实现条件编译

template<typename T>
typename enable_if<is_same_v<T, string>, string>::type ToString(T t)
{
	return t;
}
template<typename T>
typename enable_if<!is_same_v<T, string>, string>::type ToString(T t)
{
	return to_string(t);
}

int main()
{
	cout << ToString(1234567890);
	cout << ToString(string("123"));
	return 0;
}

这个代码实现了,如果是string类型的参数就直接返回,否则就调用to_string函数再返回。

应用示例:UpperType

把整数类型变成long long,非整型不变

template<typename T, bool flag>
struct enable {
	typedef T type;
};
template<typename T>
struct enable<T, true> {
	typedef long long type;
};
#define UpperType(T) typename enable<T, is_integral_v<T>>::type

   	template<typename T>
	static UpperType(T) getSum(const vector<T>& v)
	{
		UpperType(T) ans = v[0];
		for (int i = 1; i < v.size(); i++)ans += v[i];
		return ans;
	}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值