Вы использовали cppnetlib / uri .
Однако через 4 года go у них было (еще одно) нарушение интерфейса :
Заменены аксессоры, возвращающие необязательные объекты string_view, двумя отдельными функциями.
Что еще хуже, они по-прежнему возвращают свернутый вручную string_view
вместо стандартного.
Кроме того, в их версии network::optional<>
никогда не было get_value_or
. Фактически get_value_or
предназначен только для Boost, где он устарел в пользу (стандартного) value_or
.
Заключение
Используйте has_scheme()
аксессор чтобы увидеть, присутствует ли схема. Вы можете сделать из этого необязательное:
#include <boost/utility/string_ref.hpp>
#include <network/uri/uri.hpp>
#include <network/string_view.hpp>
#include <optional>
int main() {
network::uri serviceUri("http://cpp-netlib.org/");
network::optional<network::string_view> scheme, hostname, port;
if (serviceUri.has_scheme())
scheme = serviceUri.scheme();
if (serviceUri.has_host())
hostname = serviceUri.host();
if (serviceUri.has_port())
port = serviceUri.port();
scheme = scheme.value_or("part1");
hostname = hostname.value_or("localhost");
port = scheme.value_or("2800");
}
В качестве альтернативы вы можете полностью избегать network::optional
и network::string_view
и просто написать:
#include <network/uri/uri.hpp>
#include <optional>
int main() {
network::uri serviceUri("http://cpp-netlib.org/");
std::string const scheme = serviceUri.has_scheme()
? serviceUri.scheme().to_string()
: "part1";
std::string const host = serviceUri.has_host()
? serviceUri.host().to_string()
: "localhost";
std::string const port = serviceUri.has_port()
? serviceUri.port().to_string()
: "2800";
}