小ネタ

std::make_shared から private コンストラクタを呼び出す

std::make_shared で private コンストラクタを呼ぶには,関数内クラスと継承を利用すれば良い. class hoge { hoge(); // private ctor public: static std::shared_ptr<hoge> create() { // return std::make_shared<hoge>(); // こう書きたいが,コンパイルエラー // </hoge></hoge>…

make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない

std::make_shared は基本的には効率的だけど弱点もあるよ,って話. struct Huge { int data[1024][1024]; }; #include <memory> #include <vector> int main() { std::vector<std::weak_ptr<Huge>> vec; for( int i = 0; i < 100000; ++i ) { auto p = std::make_shared<Huge>(p); vec.push_back(p); p</huge></std::weak_ptr<huge></vector></memory>…

変数のスコープとか条件演算子とか辞書とか

Pythonにおける局所変数のスコープは、ブロックレベルではなく関数レベルで管理されます: x = 0 def f( cond ): if cond: x = 1 # これは f に変数 x を作っている。上の x とは無関係。 else: x = 2 return x # f の x が返される。 print( f(True) ) # 1 …

メンバ関数へのインスタンスの束縛をちょっとだけ簡単に

元記事: http://d.hatena.ne.jp/y_mashiro/20100122/1264102639↑の記事を見て、なるほど便利だなー、と思いつつも、boost::function を使っている事が気にくわなかったので、 boost::function を使わず静的に全てを決定出来る bind_mem_fn を作ってみました…

メンバ変数の swap 呼び出しを自動化するテク

たぶん既にあるネタと思いますが、せっかくソースコード書いたので掲載します。 C++で本格的にプログラムを書く場合、ほとんど全てのクラスに swap 関数を実装することになります。 これは例外安全の要求(詳しくは Exceptional C++ を参照)もありますし、…

typeid(T).name() に関して

メタプログラミングとかのデバッグ用に、型名を表示させたい場合ってありますよね。 そういう場合は、typeid 演算子を使って、 #include <typeinfo> #include <iostream> int main() { std::cout << typeinfo(int).name() << std::endl; } とかやればいい訳ですが、ここで問題が</iostream></typeinfo>…

class と struct

class と struct はデフォルトのアクセス指定が private か public かという違いがあるだけで、本質的に同じものです。以上。 というだけでは寂しいので、証拠をば。 #include <iostream> using namespace std; class hoge; // hoge を 'class' と宣言 struct fuga; //</iostream>…

とりあえずメモリを確保→後からオブジェクトを構築するテク

C++でコーディングしていると、「とりあえずオブジェクトの入る場所は確保しておきたいけど、今はまだオブジェクト自身を作りたくはない」という場面に時折出くわします。 そういう場合、ポインタと std::auto_ptr (あるいは boost::scoped_ptr )を使って…