C++ 17 模版约束
cpp
template <typename T, typename = void>
struct is_string : std::false_type
{
using value_type = T;
};
template <typename T>
struct is_string<T,
std::void_t<
typename T::value_type,
typename T::traits_type,
typename T::allocator_type
>
> : std::is_same<
T,
std::basic_string<
typename T::value_type,
typename T::traits_type,
typename T::allocator_type
>
>
{
using value_type = T;
};
// 约束包装器
template <typename T>
using if_string = std::enable_if_t<is_string<T>::value, T>;
C++ 模版实现(HPP)
cpp
/// @brief 根据字符串的对齐长度来决定是否需要字符串左侧填充字符
/// @tparam _Ty 字符串类型
/// @param s 字符串
/// @param count 对齐数量
/// @param padding_char 对齐字符
/// @return 返回对齐好之后的完整字符串
template <typename _Ty, typename = stl::if_string<_Ty>>
_Ty PaddingLeft(const _Ty& s, size_t count, typename _Ty::value_type padding_char) noexcept
{
size_t str_len = s.size();
if (count == 0 || count <= str_len)
{
return s;
}
// 构造填充字符 + 原字符串
_Ty result;
result.reserve(count);
// 添加填充字符
result.append(count - str_len, padding_char);
// 添加原字符串
result.append(s);
return result;
}
/// @brief 根据字符串的对齐长度来决定是否需要字符串右侧填充字符
/// @tparam _Ty 字符串类型
/// @param s 字符串
/// @param count 对齐数量
/// @param padding_char 对齐字符
/// @return 返回对齐好之后的完整字符串
template <typename _Ty, typename = stl::if_string<_Ty>>
_Ty PaddingRight(const _Ty& s, size_t count, typename _Ty::value_type padding_char) noexcept
{
// 构造原字符串 + 填充字符
_Ty result = s;
if (count > result.size())
{
result.resize(count, padding_char); // 直接在末尾填充
}
return result;
}