В следующем примере я пытаюсь emplace_back()
строковый литерал и string_view
преобразовать в std::pair
из string_views
. Однако моя проблема в том, что emplace_back()
принимает строковый литерал как массив константных символов и не превращает его в указатель. Следствием этого является то, что emplace_back()
не может найти конструктор const char* std::string_view
. Как я могу расщепить строковые литералы вручную как часть аргументов функции (которые агрессивно поглощаются универсальными ссылками)?
#include <utility>
#include <vector>
#include <string>
#include <string_view>
#include <cstdio>
struct A
{
std::string_view vsn_ = "0.0.1";
std::string_view key_;
};
auto get_url(A params = {})
{
std::vector<std::pair<const char*, std::string_view>> queries;
if (!params.key_.empty()) {
queries.emplace_back(std::piecewise_construct, ("key = "), params.key_);
}
if (!params.key_.empty()) {
queries.emplace_back(std::piecewise_construct, ("VSN = "), params.vsn_);
}
std::string url;
for (auto q : queries) {
url += q.first;
url += q.second.data();
}
return url;
}
int main()
{
printf("%s", get_url().data());
}
(Как видите, я уже пытался заключать в скобки строковые литералы, но безрезультатно)
Почему вы используете std::piecewise_construct
? Просто удалите их, и ваш код скомпилируется.
Конструктор std::piecewise_construct
(который вы пытаетесь использовать здесь для конструкции std::pair
) ожидает, что остальные аргументы будут std::tuple
s, причем каждый кортеж содержит аргументы для создания одной из частей (например, парных элементов).
Вы не передаете кортежи в качестве второго и третьего параметра, поэтому это не может работать. Должен быть
queries.emplace_back(std::piecewise_construct,
std::forward_as_tuple("key = "),
std::forward_as_tuple(params.key_));
Однако, если вы хотите построить каждый элемент пары только из одного аргумента, вам не нужен кусочный конструктор. std::pair
имеет конструктор специально для этого:
queries.emplace_back("key = ", params.key_);
Ничто из этого не имеет никакого отношения к тому, распадается ли массив на указатель. (Он будет разлагаться там, где это требуется, ручное вмешательство не требуется.)
Я думаю, я никогда не понимал этого до сих пор, спасибо
Почему используется
piecewise_construct
?