Основные рекомендации C++ продвигает практику используя span
.
Проблема заключается в константных и изменяемых диапазонах. Вот что я пытался сделать:
auto foo(gsl::span<int>); // 1st
auto foo(gsl::span<const int>); // 2nd
Но их нельзя вызвать без явного span
приведения/конструкции аргумента:
std::vector<int> v;
const std::vector<int> cv;
const std::vector<int>& crv = v;
// ambiguous
// want to call 1st
foo(v);
// ambiguous, although 1st is illegal (static_assert kicks in)
// want to call 2nd
foo(cv); // ambiguous
foo(crv); // ambiguous
Каков правильный способ справиться с этим?
Это кажется чем-то тривиальным, аналогом перегрузок const T&
и T&
, но это не так (или я просто не вижу этого).
Просто чтобы быть на одной странице, foo(gsl::span<int>{v})
громоздко, и я хочу избежать этого, оставьте звонящие простыми: foo(v)
.
Я обобщил проблему, но на всякий случай, если это проблема XY, я на самом деле пытаюсь сделать следующее:
auto split(gsl::cstring_span<> str) -> std::vector<gsl::cstring_span<>>;
auto split(gsl::string_span<> str) -> std::vector<gsl::string_span<>>;
и хотите, чтобы его можно было вызывать с аргументами [const] char *
, [const] string
и т. д.
const std::vector< int >
? Уверен в этом? Разве это не должно бытьstd::vector< const int >
? - person DevSolar   schedule 07.03.2016const std::vector<int>& crv = v
. - person bolov   schedule 07.03.2016string&
иconst string&
, я думаю, это более понятно. - person bolov   schedule 07.03.2016span<int>
,span< const int >
) не соответствует его второму (std::vector< int >
,const std::vector< int >
) намерению. (Также святой некро Бэтмен... :-D ) - person DevSolar   schedule 28.02.2020