ノート 18/5/7
1.std::stringで文字列を検索して全部置換する方法
C++ 文字列の置換/全置換【replace/replace_first/replace_all|std::string】 | MaryCore
std::string s = "a, b, c"; // 置換対象の文字列
std::string target = ", "; // 検索文字列
std::string replacement = "-"; // 置換文字列
if (!target.empty()) {
std::string::size_type pos = 0;
while *1 != std::string::npos)
{
s.replace(pos, target.length(), replacement);
pos += replacement.length();
}
}
2.templateの特殊化は外で行う
//T.hpp
struct T
{
template <class X> X f();
//コンパイル エラー
// template <> int f() { return 1; }
};
//こちらが正しい
template <> int f() { return 1; }
3. 関数の後ろに アロー(->) がついてる書き方
戻り値を指定する書き方の1つ
template <class T> auto f() -> T { }
4. テンプレート・テンプレート
std::vector<T>とTを受け取りたい時の書き方
template <template <class> class S, class T> f();
例
f<std::vector<int>>();
//ちょっと自信ないので後で検証する
5. jsonのパース
picojsonとjson11を使ってみた.
picojsonは数値=doubleなので、キャストが面倒くさい
それからjsonを生成する処理が冗長
例
using o = picojson::object;
using v = picojson::value;
int id = 12345;
o j;
j.insert({"id", v(static_cast<double>(id))});
既に括弧地獄で意味不明.
もう1つ.配列が面倒くさい
parseの際に1つ1つ取り出すのは仕方ないが、json生成のときに1つ1つvalueに変換してarrayに格納しなければならずいらいらする.
json11
上記のうるさいコードを書かずに済むみたい.
例
//test.json
{
"data": [
{
"id": 123,
"name": "aiu";
},
{
//省略
}
]
}
//std::string srcはjsonファイルの中身
std::string err;
json11::Json json = json11::Json::parse(src, err);
for (auto& e : json["data"].array_items) {
std::cout << e["id"].int_value() << std::endl;
}
このように取り出す
json生成
using object = json11::Json::object;
using array = json11::Json::array;
{"data",
array {
object {
{"id", 123},
{"name", "asdf"}
},
object {
//略
}
}
}
};
6.std::stringと数値の変換
std::string s = std::to_string(12345);
#include <sstream>
#include <type_traits>
V v;
std::stringstream s;
std::string src;
if (std::is_integral<V>() || std::is_floating_point<V>()) {
s << src;
s >> v;
}
//コードの貼り方が分からない
//気が向いたら調べます
できたっぽいです.次の記事から反映されます
*1:pos = s.find(target, pos