cpp 14 ~ cpp 17
对于每次写std::is_integral<T>::value和std::enable_if<B>::type都比较麻烦。
因此 cpp 14 建议可以通过另一个简单的符号表示该内容。也就是type trait variable templates的概念。

直到 cpp 17 才在正式标准中进行了全面的完善。
// cpp14
template< bool B, class T = void >
using enable_if_t = typename enable_if<B,T>::type;
// cpp17
template< class T >
因此我们可以得到以下的简洁版本。
#include <iostream>
#include <type_traits>
#include <vector>
namespace my {
template <typename Type>
class vector {
public:
vector(size_t len, Type val) {
std::cout << "vector(size_t len, Type val)" << std::endl;
}
/**
cpp 20
c++ 是一门不断发展的现代语言,在 cpp 20 中提出了概念和约束到标准中。
requires 是一个关键字。可以直接在模板函数中进行使用。
requires是在template和函数体之间编写,提升可代码可阅读性。
注意一点,requires 子句需要是一个初等表达式 或者 带括号的表达式。
#include <concepts>
#include <iostream>
#include <type_traits>
#include <vector>
namespace my {
template <typename Type>
class vector {
public:
vector(size_t len, Type val) {
std::cout << "vector(size_t len, Type val)" << std::endl;
}
// 使用 requires 关键字
// 直接写出约束条件
template <typename Iter>
requires (!std::is_integral_v<Iter>)
vector(Iter begin, Iter end) {
std::cout << "vector(Iter begin, Iter end)" << std::endl;
}
};
} // namespace my