如sbabbi's answeras_span
所示是一个体面的解决方案span
。然而没有as_string_span
,这将解决我真正的问题。
这里是我的简单实现:
template <class Char_t, gslx::size_t N>
auto as_basic_string_span(gsl::basic_string_span<Char_t, N> str)
-> gsl::basic_string_span<Char_t, N>
{
return str;
}
template <class Char_ptr_t>
auto as_basic_string_span(Char_ptr_t ptr)
-> std::enable_if_t<
stdx::is_pointer_v<Char_ptr_t>,
gsl::basic_string_span<std::remove_pointer_t<Char_ptr_t>>>
{
Expects(ptr != nullptr);
return {ptr, gslx::size_cast(stdx::char_traits_length(ptr))};
}
template <class CharT, gslx::size_t N>
auto as_basic_string_span(stdx::c_array_t<CharT, N>& arr)
-> gsl::basic_string_span<CharT, N - 1>
{
Expects(N > 0 && arr[N - 1] == '\0');
return arr;
}
template <class Char_t, class Traits, class Allocator>
auto as_basic_string_span(std::basic_string<Char_t, Traits, Allocator>& str)
-> gsl::basic_string_span<Char_t>
{
return {const_cast<Char_t*>(str.data()), gslx::size_cast(str.size())};
}
template <class Char_t, class Traits, class Allocator>
auto as_basic_string_span(
const std::basic_string<Char_t, Traits, Allocator>& str)
-> gsl::basic_string_span<const Char_t>
{
return {str.data(), gslx::size_cast(str.size())};
}
template <class Char_t, class Traits, class Allocator>
auto as_basic_string_span(std::basic_string<Char_t, Traits, Allocator>&& str) =
delete;
奖金as_const_basic_string_span
:
template <class Char_t, gslx::size_t N>
auto as_const_basic_string_span(gsl::basic_string_span<Char_t, N> str)
-> gsl::basic_string_span<const Char_t, N>
{
return str;
}
template <class... Args>
auto as_const_basic_string_span(Args&&... args)
-> decltype(as_const_basic_string_span(
as_basic_string_span(std::forward<Args>(args)...)))
{
return as_const_basic_string_span(
as_basic_string_span(std::forward<Args>(args)...));
}
与用法:
template <class CharT>
auto split(gsl::basic_string_span<CharT> str)
-> std::vector<gsl::basic_string_span<CharT>>
template <class T>
auto split(T&& str)
{
return split(as_basic_string_span(std::forward<T>(str)));
}
'常量的std ::矢量< int >'?对吗?不应该是'std :: vector < const int >'? – DevSolar
@DevSolar是的,这就是我的意思。想想'const std :: vector&crv = v'。 –
bolov
@DevSolar如果你考虑'string&'和'const string&'我认为它更清楚。 – bolov