C++のファンクタ

C++ファンクタとは関数のように扱えるインスタンスです。以下のコードは最も簡単なファンクタです。

以下のコードはintを引数とするファンクタです。vectorに対してfor_eachを使ってすべての要素に対して、ファンクタをコールしています。

以下のコードはstd::bindを使って、ファンクタを作成しています。

以下のコードは多段にファンクタを作っています。このように引数を減らすことをカリー化といいます。

4127警告とpragma disable

マイクロソフトのC++コンパイラで以下のマクロをコンパイルすると警告4127(条件式が定数)が出る。

この警告を消したくてpragmaを使おうとしても、外から囲うと無意味だし中に書くと#がマクロの文字列化でうまくいかない。

__pragmaキーワード

マイクロソフト拡張のこのキーワードを使えば解決できる。

C#でファイルをクリップボードに「切り取る」

ここここより要約

C#のWeakReference

C#の参照はオブジェクトを保持している変数がある限り、ガーベッジコレクトされることはありません。こういう参照は強い参照と呼ばれます。WeakReferenceの参照はそれを保持していても、他の強い参照がない限りガーベッジコレクトされます。

WeakReferenceにはShortとLongがありますが、ここではShortのみ考えます。

アプリケーションがモードレスなダイアログ(メッセージボックスのようなOKを押さない限り次に進めないものをモーダルダイアログといい、そうでないのをモードレスといいます)をいくつも作り、それを配列に格納したいとします。普通の配列やコレクションを使うと、参照は強い参照になるので、このダイアログが閉じられても参照を保持し続けガーベッジコレクトされることはありません。これをWeakReferenceの配列として持てば閉じられたダイアログはガーベッジコレクトされ、メモリの節約になるかもしれません。

まずアプリケーションのメインフォームのメンバーにWeakReferenceのListを加えます。

アプリケーションがモードレスダイアログをつくって、このリストにWeakReferenceを追加します。

WeakReferenceのコンストラクタに渡したオブジェクトは他の強い参照がなくなればガーベッジコレクトされます。

Listから列挙

WeakReferenceのTargetがすでにガーベッジコレクトされている場合はnullが返ります。ただしオブジェクトがガーベッジコレクトされるかは定かではありませんのでタイミングには注意が必要と思われます。それと、ガーベッジコレクトされてもWeakReferenceオブジェクト自体は消えませんので上記のようなやり方でずっとやると、Listがどんどん大きくなっていってしまいます。

C++でconstと非constの実装をひとつにしたい

ここでGetNameの実装をひとつにしたい。

ソースはツーチャネルとhttp://stackoverflow.com/questions/4589622/simplifying-const-overloading