ボレロ村上 - ENiyGmaA Code

中3女子です。

メタ関数の実装技法 - その2

前回(メタ関数の実装技法 - その1 - ボレロ村上 - ENiyGmaA Code)に続き、メタ関数の実装技法その2です。 関数の呼び分けと decltype を利用したメタ関数 たとえば、クラスメンバに型名 value_type を持つか判定するトレイトを考える。 has_value_type t…

メタ関数の実装技法 - その1

そもそもメタ関数とは (参照:More C++ Idioms/メタ関数(Metafunction) - Wikibooks) 一般に C++ でメタ関数とは、与えられたテンプレート引数から、結果として何か型やコンパイル時定数を返す(定義する)ようなクラステンプレートをいう。 代表的な例と…

コンパイル時数列生成 generate/unfold/recurrence

Sprout C++ Library Github https://github.com/bolero-MURAKAMI/Sprout ご存じのように Sprout には constexpr アルゴリズムがある。 ここでは、そのうち generate と unfold, および recurrence について解説する。 というのも、最近これらについてかなり…

static データメンバの初期化 - constexpr な場合とそうでない場合

constexpr の間違った使い方。 - C++でゲームプログラミング この記事へのフォローです。 constexpr static データメンバの場合は、"コンパイル時定数である変数は、宣言と同時に初期化しなければならない" という原則にしたがって、 クラススコープの内側に…

constexpr を使うべき5の理由 - まとめ&リンク集

「constexpr を使うべき5の理由」の連載をひとまず終えたので、記事の一覧をここにまとめておきます。 また、その他の資料や情報へのリンクを載せておきますので、更に興味あるという方は読んでみるのもよいでしょう。 constexpr を使うべき5の理由 1.定数を…

constexpr を使うべき5の理由 - その5

「constexpr を使うべき5の理由」ひとまず最終回です。 コンパイル時に計算ができると聞いて、誰もがまず思い浮かべる用途は、おそらく、実行時に必要となる値をあらかじめ計算しておくというものでしょう。 5.必要なものをなるべく早く用意しておくために …

constexpr を使うべき5の理由 - その4

「constexpr を使うべき5の理由」ようやく4つめです。 今回は、いわゆるメタプログラミングにおける constexpr について取り上げます。 4.あのうんざりするテンプレートメタプログラミングによる数値計算からはもはや解放された 以下のコードは、[1 .. 5] の…

constexpr を使うべき5の理由 - その3

相変わらず「constexpr を使うべき5の理由」です。 今回は、関数に対する constexpr 指定のもう一つの意味について取り上げます。 3.副作用がないことを保証する 「ねむらなくてもつかれないくすり」に副作用はあるのでしょうか。疲労をポンと感じなくさせて…

constexpr を使うべき5の理由 - その1

constexpr を使うべき5の理由 「なぜあなたは constexpr を使うべきか?」 「そもそも constexpr とは何か」という基本的な部分から始めて、 どうして C++er が constexpr を使わなければならないか、日にちを分けて5つのケースを書いてみます。 constexpr …

constexpr を使うべき5の理由 - その2

引き続き、「constexpr を使うべき5の理由」です。 ここでは、できるかぎり関数に constexpr を付けることが如何に C++er の義務であるかを示します。 2.定数を返す関数をコンパイル時定数にする #include <limits> constexpr auto v = std::numeric_limits<double>::max(); </double></limits>…

コンパイル時離散フーリエ変換(DFT)

コンパイル時離散フーリエ変換(DFT) Sprout.Numeric.DFT は、constexpr DFT アルゴリズムを提供します。 https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/numeric/dft DFT は周波数解析などに用いられますが、ここでは詳しくは述べません。 …

Sprout.Io - とりあえず文字列へ変換/コンパイル時のパフォーマンスとバッファサイズの話

Github - Sprout https://github.com/bolero-MURAKAMI/Sprout Sprout.Io は、コンパイル時に文字列をソース/シンクとした入出力を行うことを目指すライブラリです。 基本的に iostream ライクな記法です。 Sprout.Io で文字列へ変換する #include <iostream> #include <sprout/io.hpp></sprout/io.hpp></iostream>…

次期 C++ ではポインタ演算は定数式になるようだ/次期 C++ の constexpr 化を考える

§5.19 Constant expressions (N3290 より抜粋) 2 A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression (3.2), but subexpressions of logical AND (5.14), logical …

constexpr 関数から引数のメンバ関数を呼ぶための forward

この記事で取り上げた問題について。 小ネタ - constexpr の文脈でconstメンバ関数と非constメンバ関数を呼び分ける - ボレロ村上 - ENiyGmaA Code 簡単に言えば constexpr 関数では、 引数が rvalue reference の場合、constメンバ関数が呼ばれてほしいわけ…

index_tuple イディオムにおける index_range の効率的な実装

コードをコミットしたのはだいぶ以前だけど言及していなかったので書きます。 Github - Sprout/sprout/index_tuple https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/index_tuple index_tuple Idiom そのものについては、ググればそれっぽい情…

小ネタ - constexpr の文脈でconstメンバ関数と非constメンバ関数を呼び分ける

ちょっと嵌っていたのでメモがてら。 次のような get() メンバ関数を持つクラスと get() フリー関数があったとする。 template<typename T> struct X { T t; T& get() { /* 非const版 */ return t; } constexpr T const& get() const { /* const版 */ return t; } }; tem</typename>…

Sprout の破壊的変更 - constexpr コンテナのトレイト周りの刷新

Sprout C++ Library Github https://github.com/bolero-MURAKAMI/Sprout Sprout に大幅な破壊的変更が入りました。 ユーザコードにおいて、コンテナのトレイト関連を使用したコードは、新しいものに書き換えする必要があります。 また、ユーザ定義のコンテナ…

コンパイル時 FizzBuzz を読んでの Sprout C++ Library 改善

id:osyo-manga さんの Sprout を使った記事↓ [C++][Sprout]Sprout でコンパイル時 FizzBuzz http://d.hatena.ne.jp/osyo-manga/20111207/1323187352 を読んで、「ああ、Sprout にこんな機能が足りなかったな」という部分に思い当たったので、 それを追加した…

Sprout.Darkroom で外部ファイルからのテクスチャマッピング

https://github.com/bolero-MURAKAMI/Sprout Sprout.Darkroom に、コンパイル時に外部ファイルからテクスチャを読み込む機能を追加しました。 テクスチャマッピングの定番ということで、球体に世界地図を Spherical Mapping で貼り付けてみます。 out.png ア…

Sprout.Darkroom でチェック模様のテクスチャを使ったレンダリング

Sprout.Darkroom は、constexpr ベースのコンパイル時レイトレーシングライブラリです。 https://github.com/bolero-MURAKAMI/Sprout Sprout.Darkroom は、特定のインタフェースのクラスをテクスチャマップやスペキュラマップとして オブジェクトに設定する…

Boost.Wave を使ってみる

本記事は、Boost Advent Calendar 2011 の9日目の記事です。 本稿では Boost.Wave という C/C++ プリプロセッサライブラリについて書きます。 Boost.Wave とは Boost.Wave は、パーサコンビネータライブラリ Boost.Spirit によって書かれた C/C++ プリプロセ…

constexpr レイトレーシング

これは、Sprout.Darkroom ライブラリの constexpr レイトレーサーでレンダリングした画像です。 画像サイズは 512×512 pixel。 もちろん画素データはすべてコンパイル時に生成され、ファイル出力のみが実行時に行なわれています。 光源は手前右側にあり、手…

constexpr ライブラリ

constexpr を主眼としたライブラリは未だそう多くないと思います。 C++標準ライブラリでは、numeric_limits や chrono など自明ないくつかの機能が constexpr 化されています。 また、libstdc++ など標準ライブラリベンダの独自拡張として constexpr 化され…

constexpr のコンパイラ対応

gcc4.7 は、constexpr によく対応しています。 なお、この記事のコードは gcc 4.7.0 20111126 (experimental) において検証・実行しています。 VC10 は、全く以て constexpr に対応していません。 C++11 時代の C++er は、VC10 を使うとき C++11 のことを忘…

constexpr とは

constexpr は C++11 で導入された指定子のキーワードです。 変数を明示的にコンパイル時定数として宣言したり、 実行時にもコンパイル時にも呼出しできる関数を宣言したりできます。 また、C++03 の定数値のように整数型や列挙型だけでなく、浮動小数点型や…

constexpr でレイトレーシング

本記事は、C++11 Advent Calendar 2011 の5日目の記事です。 本稿では C++11 の新機能である constexpr について書きます。 まず最初にお断りしなければならないのは、この記事は constexpr そのものについて詳しく解説したり、 導入の一助となるべく書かれ…

Sprout.Algorithm - constexpr mutating operations アルゴリズム入門

以前も書きましたが、Sprout C++ Library は固定長コンテナに対する STL ライクな変更のアルゴリズムを提供します。 Github https://github.com/bolero-MURAKAMI/Sprout もちろん constexpr では代入操作が出来ないので、インタフェースなどは STL とは異な…

関数パラメータパックと無限再帰の問題

Variadic Templates は強力なC++11 の新機能である。 これを関数の可変長引数に適用したものを関数パラメータパック(function parameter pack)と呼ぶ。 もちろん constexpr でも関数パラメータパックは重宝する。 ところで、これを再帰と組み合わせた場合…

Sprout.Random - コンパイル時の乱数生成

Sprout.Random - コンパイル時の乱数生成 実装してみた。 Github https://github.com/bolero-MURAKAMI/Sprout ヘッダは です。 シードとして使える SPROUT_UNIQUE_SEED マクロは にあります。 現時点で実装済みであるのは、 ・ジェネレータ minstd_rand0, mi…

Sprout C++ Library

Github https://github.com/bolero-MURAKAMI/Sproutこのライブラリは、C++11 の constexpr に対応した、固定長コンテナに対する STL ライクな変更のアルゴリズムやコンテナ操作を提供する。 constexpr は面白いです。おそらく C++11 時代の C++er たちの新し…