ищу идиоматический способ объединения строковых представлений объектов

Учитывая, что у нас есть это:

Пример кода A:

struct parameter
{
string name, value;
};

ostream& operator<<(ostream& out, const parameter& p)
{
return out << p.name << "=" << p.value;
}

Пример кода B:

auto seq = {
parameter{ "language", "En" },
parameter{ "q", "search+term" }
};

vector<string> tmp;
transform(begin(seq), end(seq), std::back_inserter(tmp),
[](const auto& p) {
ostringstream out;
out << p;
return out.str();
});
auto result = boost::algorithm::join(tmp, "&");

Есть ли способ сделать образец кода B более идиоматичный? Я пытаюсь избежать использования tmpпри вычислении result,

Изначально я пытался позвонить boost::algorithm::join прямо на seq (это не работает, потому что соединение работает только с последовательностями символов в качестве соединяемых элементов).

Я также мог бы использовать один ostringstream и отказаться boost::algorithm::join полностью (но это добавило бы дополнительный &), или итерации по количеству элементов, избегая явного добавления дополнительного амперсанда в конце, или определяю мой собственный итератор ostream (но это много кода для записи).

Спасибо

1

Решение

Для чего-то более идиоматического, вы можете использовать boost::adaptors::transformed следующим образом:

std::vector<parameter> seq = {{"language", "En"}, {"q", "search+term"}};
auto result = boost::algorithm::join(seq |
boost::adaptors::transformed([](parameter const &p){return p.name + "=" + p.value;}),
"&");

Live Demo

Нет временного вектора, нет дорогих струнных потоков.

0

Другие решения

Если я правильно понял, и отсутствует аргумент std :: transform insert_iterator Для tmp самый простой способ сделать это (и самый быстрый!) — это что-то вроде следующего:

std::ostringstream out;
for (auto&& item : seq)
out << item << "&";
std::string str = out.str();
if (str.size() > 0)
str.resize(str.size() - 1);

Нет необходимости использовать извилистое преобразование с уродливым лямбда-синтаксисом, и нет необходимости создавать временный вектор только для вызова соединения с ним и выделения заново.

0

По вопросам рекламы [email protected]