タグ

ブックマーク / boleros.hateblo.jp (13)

  • C++初心者会で話題になったClangの相互再帰バグについて - ボレロ村上 - ENiyGmaA Code

    中3女子です。 歌舞伎座.tech#8「C++初心者会」という勉強会が先日あり、自称初心者やクソザコによるさまざまな発表がおこなわれた。自分は参加できなかったので、いくつかの発表をニコ生で視聴した。 その中に、@wx257osn2 氏による constexpr ラムダライブラリを実装したという発表があった。実装にあたっては Clang のバグに対処するワークアラウンドを書くのに苦労したという。さもありなん。Clang は全体的な規格準拠度ではおおむね GCC 以上といってよいが、constexpr 関係ではいまだに致命的なバグを残している。それがどのようなバグなのか応答で齟齬があったようなので、脇からの補足をここに記しておく。 Clang の constexpr 関係の致命的なバグとは、相互再帰におけるバグである。相互再帰する constexpr 関数テンプレートを実体化すると、テンプレー

    C++初心者会で話題になったClangの相互再帰バグについて - ボレロ村上 - ENiyGmaA Code
  • C++14 時代の constexpr プログラミング作法 - ボレロ村上 - ENiyGmaA Code

    この記事は、C++ Advent Calendar 2013 の参加記事です。 前回は 西山信行 さんの記事でした。 まもなく C++14 時代が到来しようとしている。 ただでさえ実用的な言語機能である constexpr が C++14 での制限緩和によって神になろうとしている。 C++11 での constexpr の制限は、必然的に副作用のない関数型プログラミングを強制し、とても興味深いものではあった。 コードの可読性云々は主観によるのでここでは置くが、時には非効率な実装にならざるをえないケースもあったのは事実だ。 C++14 での constexpr は、古典的な実行時処理に慣れた者達にも非常に親しみやすいコードが書けるようになる。 ドラフトの直接的な内容については、すでに自分をはじめ有識者が解説を書いているので、そちらを参照するのが手っ取り早い。 constexpr 関数の制限緩

    C++14 時代の constexpr プログラミング作法 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/12/25
  • リテラル型クラスの条件、および「中3女子でもわかる constexpr」の訂正 - ボレロ村上 - ENiyGmaA Code

    中3女子です。 これはおよそ一年半前(2011/12/3)に公開したスライドだが、この中の記述に規格上の誤りがあるので、今更だがここで訂正しておく。 中3女子でもわかる constexpr from Genya Murakami 問題は p.20〜『◆リテラル型クラスの条件』の項目だ。 この中の記述は、C++11 の規格策定における議論段階の文言を元にしており、これは後に文言が改訂されたため、 スライド中の記述と現行 C++11 の規格とで齟齬が生じてしまっている。 ちなみに、現行 C++11 の規格では、リテラル型クラスの条件はこのようになっている。 N3337 § 3.9 Types - 10 より抜粋 ― a class type (Clause 9) that has all of the following properties: ― it has a trivial destr

    リテラル型クラスの条件、および「中3女子でもわかる constexpr」の訂正 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/07/19
  • C++11の糞仕様と戦ってアクセッサをconstexprにする - ボレロ村上 - ENiyGmaA Code

    中3女子です。 C++11が、C++03およびそれ以前に対して明らかに優れていることは今更言うまでもない。 しかしながら、C++11にも恥ずべき糞仕様は存在する。 その糞の代表例が、constexprメンバ関数が暗黙でconst修飾されることである。 これによってどんな問題が生ずるかを、まずは見てゆく。 constexprメンバ関数が暗黙でconst修飾される糞仕様の問題 まずは、適当な値のホルダクラスを考える。 template<typename T> struct Holder { T value; }; Holderはリテラルクラスの要件を満たすから、当然定数式として扱える。 constexpr auto t = Holder<int>{ 100 }; constexpr int i = t.value; では、下記のコードは合法か? constexpr int i = Holder

    C++11の糞仕様と戦ってアクセッサをconstexprにする - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/06/05
  • すごいユーザ定義リテラルたのしく遊ぼう - ボレロ村上 - ENiyGmaA Code

    中3女子です。 今回は、みんな大好きユーザ定義リテラルについて。 ユーザ定義リテラルは、値(整数、不動小数点数、文字列)に対するプログラマブルなサフィックスを定義することができる機能である。 例えば糖衣構文や単位を持った値を扱うために用いられる。 { constexpr auto duration = 4_mins + 33_secs; } ユーザ定義リテラルはいらない子か ところで、このユーザ定義リテラルは、方々で微妙な子扱いされている。 というのも、そもそもユーザ定義リテラルは直観的な記述を可能とするものであるはずなのだが、その用法には一見非直観的な落とし穴がある。 例えばユーザ定義リテラルの識別子は、アンダースコアで始めなければならない。 なぜなら、アンダースコアで始まらないサフィックスは、すべて予約されているからだ。 プログラマがアンダースコアで始まらないユーザ定義リテラルを定義し

    すごいユーザ定義リテラルたのしく遊ぼう - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/04/16
  • constexpr アルゴリズムの実装イディオム その1 - ボレロ村上 - ENiyGmaA Code

    中3女子です。 今回は、constexpr におけるアルゴリズムの実装法について考える。 よく知られているように、constexpr 関数には言語規格上の制約が多くある。 ローカル変数が使えない、if や for などの制御構文が使えないなどは、C++11 に触れた者なら誰でも知っているだろう。 だが、それらは条件演算子や再帰によって、単純に代替できる問題である。 つまり、非 constexpr な実装に対して、処理の流れを質的に変えることなく constexpr に書き換えることができる。 単純に書き換えられる例: template<typename T> T const& runtime_min(T const& a, T const& b) { if (b < a) return b; return a; } template<typename T> constexpr T con

    constexpr アルゴリズムの実装イディオム その1 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/02/22
  • Boost.Wave を使ってみる - ボレロ村上 - ENiyGmaA Code

    記事は、Boost Advent Calendar 2011 の9日目の記事です。 稿では Boost.Wave という C/C++ プリプロセッサライブラリについて書きます。 Boost.Wave とは Boost.Wave は、パーサコンビネータライブラリ Boost.Spirit によって書かれた C/C++ プリプロセッサライブラリです。 C/C++ プリプロセッサは言うまでもなく、某社のサーバでも利用されているという純粋関数型言語です。 主に HTML ジェネレータとして活用されているという噂です。 Boost.Wave を使うことによって、C/C++ プリプロセッサを C++ のプログラム内で処理したり、 あるいはプリプロセス中の各処理にフックして解析を行なったりすることが出来ます。 Quick Start まずは 家ドキュメント の Quick Start のコードを読

    Boost.Wave を使ってみる - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/02/18
  • constexpr でレイトレーシング - ボレロ村上 - ENiyGmaA Code

    記事は、C++11 Advent Calendar 2011 の5日目の記事です。 稿では C++11 の新機能である constexpr について書きます。 まず最初にお断りしなければならないのは、この記事は constexpr そのものについて詳しく解説したり、 導入の一助となるべく書かれたものではないということです。 そのため、constexpr を使い慣れない方にとっては何を書いているか全く解らないという事があると思います。 ひとえに自分の説明能力不足と趣味によるものであり、constexpr の責任ではありません。 どうか諸兄がこの記事をもって『constexpr は全く理解に苦しむもので使いがたい』という感想を抱かぬよう願ってやみません。

    constexpr でレイトレーシング - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2013/02/15
  • constexpr で音階生成&シンセサイザー&音声合成 - ボレロ村上 - ENiyGmaA Code

    中3女子です。 このエントリは C++ Advent Calendar 2012 の 7 日目の記事です。 概要 この記事では Sprout C++ Library という拙作のライブラリによって、以下のようなプログラムを作成する。 コンパイル時音声処理ライブラリ Sprout.Compost の紹介 コンパイル時に基波形による音階を生成する コンパイル時に波形にエフェクトをかける コンパイル時に音声合成する なお、自分は音楽理論やサウンドプログラミングに関してまったく素人であり、その方面の用語や解説の不正確な部分についてはご容赦願いたい。 動作環境 記事内のコードは下記の環境でコンパイル・実行を行なっている。 コンパイラ : clang version 3.2 (trunk 159713) OS : Ubuntu 10.04 LTS (仮想環境) Memory : 3.0GiB RA

    constexpr で音階生成&シンセサイザー&音声合成 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2012/12/08
  • constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code

    「constexpr を使うべき5の理由」の連載をひとまず終えたので、記事の一覧をここにまとめておきます。 また、その他の資料や情報へのリンクを載せておきますので、更に興味あるという方は読んでみるのもよいでしょう。 constexpr を使うべき5の理由 1.定数を明示的にコンパイル時定数にする なぜあなたは const 修飾よりも constexpr 指定をするべきか。 2.定数を返す関数をコンパイル時定数にする 「市民、あなたは constexpr ですか」 「もちろんです、C++。constexpr であることは市民の義務です」 3.副作用がないことを保証する 参照透明な世界に行きたい。 4.あのうんざりするテンプレートメタプログラミングによる数値計算からはもはや解放された 型には TMP、値には constexpr。 5.必要なものをなるべく早く用意しておくために 「C++ のこと

    constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2012/12/06
  • constexpr を使うべき5の理由 - その5 - ボレロ村上 - ENiyGmaA Code

    「constexpr を使うべき5の理由」ひとまず最終回です。 コンパイル時に計算ができると聞いて、誰もがまず思い浮かべる用途は、おそらく、実行時に必要となる値をあらかじめ計算しておくというものでしょう。 5.必要なものをなるべく早く用意しておくために 何度も繰り返し同じような計算を行い、しかも実行速度が要求されるような場合(例えばゲームなど)では、最適化のために 自明な計算をあらかじめ行っておいて結果をテーブルに保持しておくことがしばしばあると思います。 非常にシンプルな例として、度数法で [0 .. 90) の範囲の正弦値を保持するテーブルを考えてみます。 #include <cmath> double degree_sin_table[90]; void init_table() { const double pi = 3.141592653589793238462643383279

    hiroyukim
    hiroyukim 2012/06/15
  • constexpr を使うべき5の理由 - その4 - ボレロ村上 - ENiyGmaA Code

    「constexpr を使うべき5の理由」ようやく4つめです。 今回は、いわゆるメタプログラミングにおける constexpr について取り上げます。 4.あのうんざりするテンプレートメタプログラミングによる数値計算からはもはや解放された 以下のコードは、[1 .. 5] のリストの各要素を加算するアキュムレートを、古式ゆかしい TMP で書いたものである。 #include <type_traits> #include <boost/mpl/apply.hpp> #include <boost/mpl/next.hpp> #include <boost/mpl/deref.hpp> #include <boost/mpl/vector_c.hpp> #include <boost/mpl/begin_end.hpp> #include <boost/mpl/int.hpp> #inclu

    constexpr を使うべき5の理由 - その4 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2012/06/15
  • constexpr を使うべき5の理由 - その1 - ボレロ村上 - ENiyGmaA Code

    constexpr を使うべき5の理由 「なぜあなたは constexpr を使うべきか?」 「そもそも constexpr とは何か」という基的な部分から始めて、 どうして C++er が constexpr を使わなければならないか、日にちを分けて5つのケースを書いてみます。 constexpr を既にバリバリ使っているというあなたにはまったく物足りないかもしれませんが、 改めてのおさらいということで読んでいただくのも一興かと存じます。 1.定数を明示的にコンパイル時定数にする 以下のコードは、定数 x のメンバを配列のサイズに指定している。 struct X { int n; }; int main() { const X x = {10}; int a[x.n] = {1}; } GCC 4.8 でこのコードは、以下のような警告とエラーになる。 warning: ISO C++

    constexpr を使うべき5の理由 - その1 - ボレロ村上 - ENiyGmaA Code
    hiroyukim
    hiroyukim 2012/06/12
  • 1