logo-sun
こんにちは!!

今日もコード書いてますか??

OSXとiOSのアプリの開発環境であるXcodeは、実は最新のC++11への対応が半端無く良くて、もしかしたら世の中で最もC++11準拠なコードか書けてるんじゃないか?と思えてしまうくらいに、実に快適にC++11でアプリの開発ができています。OSXもiOSもメインはObjective-Cのはずなのにw

VisualStudio2012は初期化子リストやconstexprなど、いくつかC++11に対応できておらず微妙。IDEはよく出来ているだけに惜しい。VisualStudio2013β版もconstexpr未実装ですからね… 大手らしくビシッとC++11対応を果たして欲しい所です。
 
で、自身気がついたらC++11の書き方じゃないともう満足出来ない体になっていたのでビックリしました…。まだC++でアプリを書き始めて3年目だというのにこのていたらく!

という訳で…使えるなら積極的に使った方があなたも幸せになれるよC++11特集です。

特集というか、いくつかお気に入りを紹介するだけなんだけどね!!


コンテナへのemplace操作
struct Hoge {
  explicit Hoge(const int value) {}
}

int main() {
  std::vector<Hoge> hoge_array;
  hoge_array.emplace_back(5);
}
コピーではなく、コンテナ内に直接、値を生成してくれて便利!!

std::unordered_map
ソートされていないmap。
ソートされていないぶんだけ速度的に有利な場合があって便利!!

std::to_string()
intとかfloatがstd::stringになるのが便利!!

std::regex
正規表現で複雑な文字列検索とか置換とかができて便利!!

std::random
標準でいろんな乱数がサポートされて便利!!

auto
std::vector<Fuga> values;
 
for (auto it = values.begin(); it != values.end(); ++it) {
  //  ↑ std::vector<Fuga>::iterator と書かなくてよくて便利!!
}

for (const auto it = values.cbegin(); it != values.cend(); ++it) {
  //  ↑ std::vector<Fuga>::const_iterator と書かなくてよくて便利!! 
}

std::unordered_map<std::string, Fuga> values;
const auto it = values.find("fuga");
//  ↑ std::unordered_map<std::string, Fuga>::const_iteratorとk(ry

コンテナのatメソッド
auto value = values.at("fuga");
要素が見つからない時に新しく値を生成しなくなって便利!!

範囲ベースfor文
std::vector<Hoge> hoge_values;

for (Hoge value : hoge_values) {
  // hoge_valuesから順番に値を取り出して変数に格納してくれる
}

右辺値参照
struct Hoge {
  Hoge() {}
  ~Hoge() {}
};

Hoge func_1() {
  return Hoge();
}

Hoge func_2() {
  Hoge value;
  return value;
}

int main() {
  Hoge value_1 = func_1();
  Hoge value_2 = func_2();
}
この手の呼び出しが最適化される事が増えて便利!!

C++11とは直接関係ないですが、ファイルストリーム
int main() {
  std::ifstream ifs("sample.txt");
  if (ifs) {
    // ↑ この書き方でファイルが開けたか判別できる!!
  }
}

iOSのアプリやWindows、OSXで動くアプリを手掛けるのなら「C++11の言語仕様や標準ライブラリに存在する機能を使わないで、わざわざ自分で実装するのはモッタイナイ!!」と思います。積極的にライブラリの仕様を調べて使った方がそれだけ手間も時間も省けますからね。バグもほとんどないし!!

最後に、cpp_akiraさんが中心となって翻訳を進めているcpprefjpを紹介しておきますね。


ではまた次回!