boost::algorithm::join
での便利な結合を提供しますstd::vector<std::string>
。
結合を行う前に、true の場合、この機能を拡張しstd::vector<std::tuple<std::string,bool>>
て結果を (文字列の場合) 一重引用符で囲むにはどうすればよいでしょうか。
これはループで行うのは難しくありませんが、標準アルゴリズムと C++11 機能(ラムダなど)を最大限に活用するソリューションを探しています。
可能であれば、ブーストの結合を引き続き使用します。 エレガンス/読みやすさ/簡潔さがより重要です。
コード
#include <string>
#include <vector>
#include <tuple>
#include <boost/algorithm/string/join.hpp>
int main( int argc, char* argv[] )
{
std::vector<std::string> fields = { "foo", "bar", "baz" };
auto simple_case = boost::algorithm::join( fields, "|" );
// TODO join surrounded by single-quotes if std::get<1>()==true
std::vector<std::tuple< std::string, bool >> tuples =
{ { "42", false }, { "foo", true }, { "3.14159", false } };
// 42|'foo'|3.14159 is our goal
}
編集
わかりました、私は以下のkassakの提案を取り、見てみましたboost::transform_iterator()
-ブースト自身のドキュメントの例の冗長さに気が進まなかったので、試しstd::transform()
ました-それは私が望んでいたほど短くはありませんが、うまくいくようです.
答え
#include <string>
#include <vector>
#include <tuple>
#include <iostream>
#include <algorithm>
#include <boost/algorithm/string/join.hpp>
static std::string
quoted_join(
const std::vector<std::tuple< std::string, bool >>& tuples,
const std::string& join
)
{
std::vector< std::string > quoted;
quoted.resize( tuples.size() );
std::transform( tuples.begin(), tuples.end(), quoted.begin(),
[]( std::tuple< std::string, bool > const& t )
{
return std::get<1>( t ) ?
"'" + std::get<0>(t) + "'" :
std::get<0>(t);
}
);
return boost::algorithm::join( quoted, join );
}
int main( int argc, char* argv[] )
{
std::vector<std::tuple< std::string, bool >> tuples =
{
std::make_tuple( "42", false ),
std::make_tuple( "foo", true ),
std::make_tuple( "3.14159", false )
};
std::cerr << quoted_join( tuples, "|" ) << std::endl;
}