ProgrammingARシステム作ったりしたからそれに関する記事書いてくぜと言うだけ言って一向に実行する気配がありませんが、今後もないわけですが(オイ)、PC上でもiOS上でも動くようにしたいなぁという要求から、システムのコアな部分はC++で書くべきなのかなという結論に至りそうな今日この頃です*1。いうわけで、久しぶりのC++なわけですが、あまりに重苦しいクラスゴリゴリプログラミングは嫌なので、とりまテンプレート周りの復習と、関数型的プログラミング手法を整理してみました。テンプレートの基本とりあえずサンプルコード。T>と全くの同義です。コンパイラが型推論が出来る場合は型指定が要らないのですが、クラスに関しては必要なようです。テンプレートとイテレータでコンテナを統一的に走査するC++はコンパイラ主義というか、オブジェクト主義なJavaやObjective-C、ゆとりなLLとは違う感覚が必要ですね。以下のサンプルコードですが、これだけのことを書くのに随分時間がかかってしまいました。結局algorithmヘッダを参考にしたのですが、Web上にはこの手のノウハウの情報が少ない気がします。0;}テンプレートでイテレータの型を汎化させておけば、コンテナを問わず同じインタフェースで取り扱えます。保守性を高めるためにイテレータが書き換え可能かを指定したい時は、テンプレート関数側でそういう制約を設けるのではなく、渡す側でconst_iteratorに型変換するのがC++的な考え方だと思います。関数内で書き換えがあった場合は、コンパイラがエラーを吐いてくれる仕組みです。C++0xからは、const_iteratorを返すcbegin/cendメソッドがコンテナに追加されたのでstatic_cast<std::list<int>::const_iterator>(aList.begin())というグロい書き方をaList.cbegin()とスッキリ書けるようになったそうです*2。ファンクタ...あぁ関数オブジェクトのことねファンクタと聞くと、Haskellを思い出したり、圏論での関手が云々とか、思わず拒否反応が出るのですが、C++でいうファンクタはそういう恐ろしい話ではなく関数オブジェクトのことを指すそうです*3。object)は、プログラミング言語において、関数(サブルーチンないしプロシージャ)を、オブジェクトとしたものである。手続きオブジェクトとも言う(プロシージャ=手続き)。ここでのオブジェクトの語は、いわゆるオブジェクト指向のそれに限らず、「第一級オブジェクト」という語におけるのと同じ、メモリ上に空間を確保されたもの、といった意味である。関数が第一級オブジェクトである場合は特に第一級関数と言う。いったような、通常のサブルーチン呼び出しと全く同じ構文で、関数オブジェクトが意味するサブルーチンを呼び出せる言語もある。変数束縛が閉じられた関数オブジェクトはクロージャである。C#などには関数オブジェクトのようなものとして、オブジェクトのインスタンスとそのメソッドである手続きとを結びつけている、デリゲートがある。関数オブジェクトは、「関数呼び出しと同じ構文で、メンバ関数を呼ぶことができるオブジェクト」として実装されている。MLのfunctorや、数学における関手とは関係ない(と考えたほうが良い)。あるオブジェクトが「ファンクタ」である、と説明される[1]。離れた文脈では、関数オブジェクトすなわちファンクタ、ではないので注意。WikipediaさすがWikipedia、素晴らしい説明ですね。いうわけでサンプルです。古い環境では、boostが必要かもしれません。0;}以下、コードの適当な説明です。Adderクラス()演算子をオーバーライドすればファンクタになる。increment型宣言はfunctionalヘッダの機能を使って、関数ポインタ型から脱却できる。main関数1行目:Adder(0)は配列範囲外のアクセス防止のために入れている。2行目:ポインタはイテレータの上位互換なので、こういう書き方もできる。このぐらいの関数が自由になると、C++使ってみてもいいかなぁという気にもなりますね。プログラミング入門*1:これまでは全部Python*2:ちなみにXcode5.0.1のg++でのサポート確認済みです。...2013-10-04swap色々ちょっとした小ネタです。2.4の環境を整えたので、そのメモです。»プロフィールid:s-shinプログラマブルな人間になりたい。(1)リンクヘルプはてなブログお知らせはてなブログをはじめよう!s-shinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。