2010-01-01から1年間の記事一覧

クラスに持たせる定数について

C++

動機: 定数の定義 - C++でゲームプログラミング 上記の記事のように、あるクラスの持つ何らかの特性をコンパイル時に得たい場合、 普通に static メンバ変数を使って struct Vector3D { // const は constexpr の方がより望ましい static std::size_t const…

rvalue-reference で one-phase construction

前回の記事で説明したように、 auto p = std::make_shared<hoge>(); のような、「関数(あるいはコンストラクタ)の戻り値を変数に束縛する」コードは、*1 one-phase construction ではありません。 これはつまり、 struct person : private boost::noncopyable //</hoge>…

One-Phase Construction 入門 〜 Constructor run once.

導入 皆さんは C++ と聞いて、まず何を思い浮かべますか? 「C++? そんなの過去の遺物だろ? GC ないとか原始的すぎるじゃん?」 って思う人もいれば、 「いや、 C++ って無闇に複雑すぎて使えない。正直 C 言語で十分でしょ」 って人もいるでしょう。 が、…

かていほうげんざい

この記事は C++ Advent Calendar jp 2010 の参加記事です。

Boost に std::unique_ptr の移植がないかな、と思ったら有った。

少し前に書いた記事 で紹介した std::unique_ptr の C++98/03 移植が Boost にないのはなんでなんだぜ、 と思っていたら、実は既にあったようなので、ここで紹介します。 Boost.Interprocess.UniquePtr Boost.Interprocess なんていう仰々しいライブラリに入…

メタプログラミング友の会に参加してきた

メタプログラミング友の会 に参加してきました。発表/参加された皆様、お疲れさまでした。 どれも素敵な発表でしたが、個人的に特に気になったのは、 稲葉さんの Polemy 光成さんの Xbyak の二点。 Polemy はこの勉強会のために作られた言語で、 一つのコー…

C++0x の最新ドラフトが N3225 に

本の虫: post-Batavia mailiingの簡易レビュー C++0x の最新ドラフトが N3225 になったようです。 今回のドラフトにおける主な変更点ですが、 ユーザ定義のデストラクタ、ムーブ、コピーが存在する場合 暗黙のムーブは生成されない 暗黙のコピーは deprecate…

C++0x 版の俺々ライブラリを地味に開発中です。

Etude C++ Libraries: http://github.com/gintenlabo/etude 時代は C++0x ですよ奥さん。 // まだマトモに使えるものが存在しないけどな! // っていうかもう一つの俺々ライブラリは絶賛放置中だけどな!

boost::scoped_ptr を魔改造してみた

C++

boost::scoped_ptr は std::auto_ptr のより安全な代替として便利に使えるクラスですが、 release 出来ない 削除関数を指定できない 関数の戻り値として使えない 配列の時は scoped_array を使わなければならない 等、いくつか不満点があります。 幸いなこと…

Lua にタプルを実装したと思ったらリストだった。

Lua

Lua は素晴らしい言語なのですが、現実の言語である以上、使っていくと色々と不満点が出てきます。 local として宣言してない変数に触ると、暗黙のうちにグローバル変数として扱われる strict.lua を使っても、苦し紛れの解決でしかない 実行時チェックなの…

ある区間の上限/下限を求める

C++

STL の upper_bound / lower_bound を使ってみたらハマったので、日記のネタに。 結論を書くと、 std::upper_bound( first, last, x ) は、区間 [ iter, last ) が std::equal_range( first, last, x ) の上界となるような iter を、 std::lower_bound( firs…

ユーザ定義されたデストラクタを持つクラスのコピー自動生成が deprecated に

C++0xに素晴らしい変更が来たようです: 本の虫: C++0xにすごい変更が来た この変更により、初心者にありがちな間違いである、 class my_string { char* buf; public: my_string( char const* s ) { std::size_t const n = std::strlen(s); buf = new char[n…

C++0x の を C++98/03 の範囲で再現してみた

C++0x の で定義されている std::all_of 辺りが使いたかったので、 その辺を適当に実装したヘッダを作ってみました:http://gist.github.com/664418 実装した関数は以下の通りです: all_of any_of none_of find_if_not is_permutation copy_n copy_if is_pa…

C++03 で C++0x の std::max_align_t をシミュレートする

C++ において、データのアライメントというのは極めて大事な概念です。*1 しかし、今までの C++ の規格では、その辺りのコードに必要な情報を得るための方法が少なく、 移植性を意識したコードを書こうと思ったら、 Boost 辺りに頼らなければいけませんでし…

pImpl + thin template 技法の簡単な例を作ってみた。

C++

テンプレート使うとヘッダが肥大化してコンパイル&リンク時間が爆発する! なんとかして! という問題への対処法です。コードはこちら: http://gist.github.com/640298 以下、解説…ですが、しっかりした解説を書くのは面倒なので、箇条書き程度に。 基本ア…

ライセンスとか

そういえば明確に言及して無かったと思うので、ここで改めて明記しておきます。 この blog に貼られたコード片*1は、特に言及がない限り NYSL です。 もし仮に何かに使おうなんていう奇特な方がいたら、自由に使ってください。 ただし、その場合は、コードの…

生ポインタの軽快な代替として使えるクラスを作ってみた。

昔 Boost.Optional Must Go (2) - 野良C++erの雑記帳 の後半に書いた、 「boost::optional はサイズの点でポインタより不利である」 という不満点を解決するためのクラスを作ってみました: etude::optional_ref http://gist.github.com/634279 使い方は …

動的メモリ確保を行わない std::seed_seq を作ってみた。

C++0x の の話。 基本的なこととかは 本の虫: C++0xの新しい乱数ライブラリ、random を参照してください。 さて、上記の記事で登場している std::seed_seq ですが、 N3126 の 26.5.7.1 Class seed_seq によると、このクラスは内部に std::vector を保持して…

Xorshift の初期化は

いろいろと検証コード書いて試してみた結果、こんな感じで行くことにしました: コード全文: http://ideone.com/RQ4KB struct Xor128 { // ... // 種を元に乱数を初期化する explicit Xor128( int_type seed ) : x(123456789), y(362436069), z(521288629),…

Xorshift の初期値読み飛ばしについて検証してみた。

動機 前回の日記でやった見積りについてご指摘いただいたので、 実際に検証してみます。 検証方法 検証方法としては、単純に、内部状態の各 bit に対し、その bit だけが立った乱数生成器を用意し、 その乱数生成器を状態遷移させていき、その内部状態の変化…

Xorshift アルゴリズムの偏りを除去するのに必要な「読み飛ばし」回数を見積もる

前回の日記で Xorshift アルゴリズムについて書いた時、最後に 「初期化された後にしばらく乱数列を読み飛ばせば偏りは簡単に回避できる」 と書きましたが、では偏りを回避するには、何回くらい読み飛ばせばよいのか、少し考えてみました。 で、それを考える…

Xorshift 乱数生成アルゴリズムを書いてみた。

前回 BarrageLL の乱数について触れたので、今回もその続き。 計算機の応用において、擬似乱数というのは大切です。 なので、世の中には、いろいろな擬似乱数の生成アルゴリズムが存在するわけですが、 今回はその中で比較的新しいアルゴリズム、 xorshift …

東方弾幕風の乱数について

東方弾幕風の乱数生成関数 rand( min, max ) は、 min 以上 max 以下の乱数を返す関数です: let x = rand( 0, 1 )例えばこう書いた場合、 x の値の範囲は 0 一方で、多くのプログラミング言語に用意されている一様な実数乱数の分布は、上端の値を含みません…

東方弾幕風のタスクシステムを Lua で再現する

そろそろ半年ほど前に提唱した BarrageLL の制作を再開していきたいと思います: 東方弾幕風の不満点、およびその解決策 - 野良C++erの雑記帳 弾幕記述フレームワーク BarrageLL 開発開始 - 野良C++erの雑記帳実は最近、ちょこちょこ github で Lua 自体のち…

std::unique_ptr でスコープガード的な何かを作る

お題 当面のスコープガード - Faith and Brave - C++で遊ぼう のスコープガードを std::unique_ptr を使って実装してみる。 std::unique_ptr を使うことで、 release() によるキャンセルが可能になるし、 メモリ確保の回避や静的解析による最適化で、パフォ…

contextually converted to bool

結論から先に言いましょう。 C++0x では、 explicit operator bool を定義すれば、自動的に ! 演算子も使えるようになります: // getchar の戻り値とかで使えそうな何か struct hoge { hoge() : ch_(-1) {} hoge( char ch ) : ch( static_cast<unsigned char>(ch) ) {} exp</unsigned>…

reference collapsing

C++98 では「参照への参照」は作ってはいけないことになっていました: typedef int& ref_t; ref_t& ref = 〜; // 駄目。参照の参照は無理。 これは、基本的には、思わぬミスを防げるので 良い仕様と言えるのですが、 テンプレートを使うときに、思わぬコン…

N3126: 20.8.15 Class template hash の T* に対する特殊化がおかしい

Boost.Flyweight の発表するときの資料として規格を見ていた時に気づいたんですが、 C++0x の Working Draft (N3126) の 20.8.15 Class template hash の項目の、 template <> struct hash<T*>;の部分がおかしいです。 正しくは、 template <class T> struct hash<T*>;となっ</t*></class></t*>…

Boost.勉強会 #2 の発表内容に対する補足とか

この前 Boost.勉強会 #2 で喋ってきたわけですが、 なにせああいった場での発表は初めてだったので、伝えたいことが伝えきれず、 また「口頭で触れたけど、スライドには書いてない」事柄が多かったので、 この場を借りて補足させていただきたいと思います。 …

Boost.勉強会 #2 で喋ってきました。

Boost.FlyweightView more presentations from gintenlabo.Ust: http://www.ustream.tv/recorded/9489637 内容は Boost.Flyweight についてです。 …とか言いつつ大半はconstに関してなのはご愛嬌。 勉強会での発表は初めてだったので拙い点は、どうぞご容赦…