#include <vector>
#include <iostream>
#include <type_traits>
using namespace std;
template<typename T, typename ... Types>
struct is_type_all_same;
template<typename T, typename T1>
struct is_type_all_same<T, T1>
{
static constexpr bool value = std::is_same_v<T, T1>;
};
template<typename T, typename T1, typename... RestTypes>
struct is_type_all_same<T, T1, RestTypes...>
{
static constexpr bool value = std::is_same_v<T, T1> && is_type_all_same<T, RestTypes...>::value;
};
template<typename T, typename... Types>
constexpr bool is_type_all_same_v = is_type_all_same<T, Types...>::value;
// C++ 20 Concept 特性
template<typename T, typename... Types>
concept SameType = is_type_all_same_v<T, Types...>;
template<typename Type>
Type increment(Type arg, Type offset)
{
return arg + offset;
}
template<typename T>
void print_vector(std::vector<T> vec)
{
for (auto& v : vec) {
cout << v << ", ";
}
cout << endl;
}
// 要求 Type 与 Types 所有类型必须相同
template<typename Type, typename... Types> requires SameType<Type, Types...>
void example_for_parameter_pack_extension(Type arg, Types... args)
{
// 模板展开
auto v1 = std::vector<Type>{ arg, args... };
auto v2 = std::vector<Type> { increment(arg, 1), increment(args, 1)... };
auto v3 = std::vector<Type> { static_cast<Type>(arg), static_cast<Type>(args)... };
print_vector(v1);
print_vector(v2);
print_vector(v3);
}
int main()
{
example_for_parameter_pack_extension(1, 1, 2, 3, 4);
// example_for_parameter_pack_extension(1, 1, 2.0, 3, 4); // error
return 0;
}
判断一个模板参数是否和之后所有参数类型相同
最新推荐文章于 2021-09-13 16:37:53 发布