でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

C++11

C++11 コンパイラの違いには気をつけろ

logo-sun
コード書いとる??

学生に「初期化子リスト便利だよね〜」ってコードレビューをしていた時のこと。

先生、ビルド通りません...

ってなったのが以下のコード。


なななな....?!

Xcodeだとビルド通るしなんで...

そこで、お仕事ご一緒されている方にVisual Studio 2015でビルドしてもらった。

ビルド通りました!!

お手数をおかけしました....

そろそろWandboxにもVisual Studioのサポートがほしいですね。


ではまた次回!! 

C++のlambda式にハマる (二回目)

logo-sun

コード書いとる??

C++のlambda式が便利過ぎます。
C++のlambda式が便利過ぎるんです。


このいったんなんの変哲も無いコードがやっぱり拙者の意に反した挙動をして悩んでました。

#include <iostream>
#include <map>
#include <functional>

struct Hoge {
  int a;

// 処理の分岐を文字列で実現できて最高!!っていう例 void f(const std::string& switch_type) { static std::map<std::string, std::function<void ()>> swith_table = { { "hoge", [this]() { std::cout << a << std::endl; } }, { "fuga", [this]() { /* do something */ } }, { "piyo", [this]() { /* do something */ } }, }; swith_table[switch_type](); } }; int main() { Hoge a; a.a = 0; a.f("hoge"); // 1が出力されるはずが0が出力される Hoge b; b.a = 1; b.f("hoge"); }


なんで..??

あああ.....!!

static、お前か!!

#include <iostream>
#include <map>
#include <functional>

struct Hoge {
  int a;

  // 処理の分岐を文字列で実現できて最高!!っていう例
  void f(const std::string& switch_type) {
    // ↓ staticがついているので、最初に生成されたときのthisがキャプチャされたまんまになる
    static std::map<std::string, std::function<void ()>> swith_table = {
      { "hoge", [this]() { std::cout << a << std::endl; } },
      { "fuga", [this]() { /* do something B */ } },
      { "piyo", [this]() { /* do something C */ } },
    };

    swith_table[switch_type]();
  }
};


int main() {
  Hoge a;
  a.a = 0;
  a.f("hoge");

  // 1が出力されるはずが0が出力される
  Hoge b;
  b.a = 1;
  b.f("hoge");
}

フフフフフ!! こんなことではへこたれないもんね...!!


ではまた次回!!

みんなも気をつけよう!! C++のlambda式の罠

logo-sun

コード書いとる??

C++のlambda式が便利過ぎます。
C++のlambda式が便利過ぎるんです。

とくに、thisのキャプチャが便利。lambda式の中でクラスのメンバ変数・メンバ関数が使える。

struct Hoge {
  int a;
  void f() { /* Do something. */ }

  void g() {
    auto l = [this]() {
      a = 0;
      f();
    };
  }
};


int main() {
  Hoge a;
}

thisのキャプチャ便利。


なーのーでーすーがー!!
このいっけん問題なさそうなコードで超ハマった.....

#include <iostream>
#include <functional>

struct Hoge {
  int value;
  std::function<void()> f;

  Hoge() :
    value(0)
  {
    f = [this]() {
      std::cout << value << std::endl;
      g();
    };
  }

  void g() {}
};


int main() {
  Hoge a;

  a.f();

  Hoge b = a;

  // b.valueを書き換えても結果が変わらない
  // a.valueを書き換えると結果が変わる
  b.value = 1;
  b.f();
}

クラスがコピーされたりすると特定の状況でキャプチャしたthisが未定義になる予感...!!

はーびっくりした...
数時間不具合と格闘して見つけたよ... でもまぁ、こうして学んでいくんだよね!!


ではまた次回。

boost::any って参照で取り出せるんだ…

30
こんにちは!!

今日もプログラム書いてる??

オレもC++書き始めて3年目。 すこしずつだけど、boostも使い始めてる。

てかboost便利すぎ!!

とくにboost::anyがお気に入りで、これを使うとC++でNSArrayやNSDictionaryっぽいのが実現できて重宝してる。

んで、ふと気づいたんだけど…

#include <iostream>
#include <boost/any.hpp>


struct Hoge {
  Hoge() :
    value(0)
  {
    std::cout << "Hoge()" << std::endl;
  }
  
  ~Hoge() {
    std::cout << "~Hoge()" << std::endl;
  }

  int value;
};


int main() {
  boost::any value = Hoge();

  {
    std::cout << "Test 1" << std::endl;
    auto v = boost::any_cast<Hoge>(value);
    v.value += 1;
  }
  
  {
    std::cout << "Test 2" << std::endl;
    auto& v = boost::any_cast<Hoge&>(value);
    v.value += 1;
    
    std::cout << v.value << std::endl;
  }    
  
  {
    std::cout << "Test 3" << std::endl;
    auto& v = boost::any_cast<Hoge&>(value);
    v.value += 1;
    
    std::cout << v.value << std::endl;
  }    
}

おおお!! コピーで取り出すだけじゃなくて、参照でも取り出せるがね!!!!(名古屋弁)

なんだよー、みんな。教えてよwww

けっこういろんな箇所で std::vector とか コピーで取り出してて恥ずかしかったわー(名古屋弁)


もちろんiOSでも使えるboost。ただ、ビルドするのが大変なので、ヘッダファイルだけで使えるのを丸ごと自分のプロジェクトのソースフォルダにコピーして使ってるんだけどな!! ワッハッハ!!(実はcpp_akiraさんにそう教えて貰ったのは内緒)


ではまた次回!! 

今日から始められる C++11 対応!!(補足)

logo-sun
こんにちは!!

今日もプログラム書いてますか?!

今回は、前回の記事の補足。「ねえねえコレは紹介しないの?」って言われたのを紹介しまっす。

やっぱりみんな何だかんだいってC++好きだよね。


fstream
void func(const std::string& file_name) {
  std::fstream fs(file_name);
  // ↑file_name.c_str() と書かなくてよくて便利!!
}
サラバ!! const char* 

mapから値を取り出す
void func(const std::map<std::string, int>& hoge) {
  std::cout << hoge.at("fuga") << std::endl;
  // ↑constなコンテナから直接値を取り出せて便利!!
}

int main() {
  std::map<std::string, int> hoge;

  hoge.insert(std::map<std::string, int>::value_type("fuga", 0));

  func(hoge);
}
自分、find()だとどうにもワンクッションはいるような感じがしてて、時には泣く泣くconstをあきらめて hoge["fuga"] って書いてたのがこれでもうなくなるー!!

const_iterator
std::vector<int> hoge;

for (auto it = hoge.cbegin(); it != hoge.cend(); ++it) {
  // ↑const_iteratorがこれでよくて便利!!
}
autoと組み合わせれば最強に簡潔に書ける(おおげさ


C++の標準ライブラリやSTLをもっとよく知りたい人はcpp_akiraさんらが手掛けるcpprefjpへゴー!


ではまた次回!!
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ