C++:模板函数限定参数类型

/ C++ / 没有评论 / 2114浏览
/************************************************************************/
/* c++模板函数如何限定参数类型
* https://www.zhihu.com/question/403570202/answer/1310165034
/************************************************************************/

#include <iostream>
#include <type_traits>
#include <string>

template<typename T>
concept IsNumber = std::is_arithmetic<T>::value;

template<IsNumber T>
void test(T t)
{
	std::cout << t << std::endl;
}

namespace detail
{
	template<class T>
	constexpr bool valid() {
		if constexpr (
			std::is_same_v<T, int> ||
			std::is_same_v<T, double> ||
			std::is_same_v<T, char> ||
			std::is_same_v<T, float>
			) {
			return true;
		}
		else {
			return false;
		}
	}
}


template<class T, std::enable_if_t<detail::valid<T>(), int> = 0>
void testA(T t)
{
	std::cout << t << std::endl;
}

template<typename Type> inline
typename std::enable_if_t<std::is_arithmetic_v<Type>, int> testB(Type&& type) 
{
	return true;
}

template<typename Type> inline
void processImpl(Type&& type) {
	if constexpr (std::is_arithmetic_v<Type>)
	{
		std::cout << "true" << std::endl;
	}
	else 
	{
		std::cout << "false" << std::endl;
	}
}

int main()
{
	int a = 1;
	std::string str = "aaa";  //传入test error;
	testA(a);
	testB(std::move(a));
	processImpl(std::move(a));
	test(a);
	return 0;
}