サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
boleros.hateblo.jp
中3女子です。 巷でズンドコキヨシなるものが流行っていたようなので C++11 constexpr でやってみた。 Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから 「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ!」って出力した後終了って関数作ったら満点で単位貰ってた— てくも (@kumiromilk) 2016年3月9日 コード: #include <cstddef> #include <type_traits> #include <stdexcept> #include <sprout/utility/any_convertible.hpp> #include <sprout/type_traits/enabler_if.hpp> #include <sprout/array.hpp> #in
中3女子です。 今度友人に InDesign で組版を教える機会ができたので、資料作成ついでにブログ記事に書くことにしました。同人ラノベの組版を InDesign で行ってゆくチュートリアルです。 版面の設計 まず版面(はんづら)を決めましょう。版面とは本文のレイアウトのことです。 即売会で小説同人誌を買うとさまざまな本文デザインの同人誌があります。独創的なデザインで作品の世界観を引き立てているものもあれば、中には読みづらくて読書意欲を損ねるようなものも少なくありません。 読書意欲を損ねるような版面とは、たとえば ・フォントがやたらでかい、もしくは細かすぎ ・行間をとりすぎてスカスカ、もしくは詰まりすぎ などがあります。 単純なことですが、これが上手くできているかどうかで文章のクォリティまで違って見えてきます。一番無難なのは、手元にある商業レーベルのラノベを実際に定規で測って参考にすること
中3女子です。 歌舞伎座.tech#8「C++初心者会」という勉強会が先日あり、自称初心者やクソザコによるさまざまな発表がおこなわれた。自分は参加できなかったので、いくつかの発表をニコ生で視聴した。 その中に、@wx257osn2 氏による constexpr ラムダライブラリを実装したという発表があった。実装にあたっては Clang のバグに対処するワークアラウンドを書くのに苦労したという。さもありなん。Clang は全体的な規格準拠度ではおおむね GCC 以上といってよいが、constexpr 関係ではいまだに致命的なバグを残している。それがどのようなバグなのか応答で齟齬があったようなので、脇からの補足をここに記しておく。 Clang の constexpr 関係の致命的なバグとは、相互再帰におけるバグである。相互再帰する constexpr 関数テンプレートを実体化すると、テンプレー
中3女子です。 この記事は C++ Advent Claneder2014 23日の参加記事です。 constexpr とは この記事を読んでいる層には、いまさら言及するまでもないと思われるので省略する。 必要であれば このあたり の資料を参照のこと。 C++14 シンタックス上の進歩とセマンティクス上の進歩 巷では C++14 になり constexpr が簡単になったという話をしばしば耳にする。たしかに簡単になった。 では何が簡単になったかというと、もっともわかりやすいのは複文とローカル変数、制御構文の制限緩和だろう。 条件分岐やループを if, while, for, switch 等でガリガリ書くことができるようになった(ただし goto は不可だ)。 非常に簡単になったといえるが、これはあくまでシンタックス上の進歩だ。 これによって何ができるかというセマンティクス上の問題について
中3女子です。 だいぶ間が空いたが、日経ソフトウエア5月号の特集記事として 僕の書いた 「constexpr」が開くコンパイル時プログラミングの世界 が掲載されたことを報告する。 「プログラムは実行時にだけ処理が行われるもの」。 そう思い込んでいませんか。それは大きな誤解です。 最新のC++コンパイラを使えば、プログラムを実行する前のコンパイル時に処理を完了できるのです。 それを可能にするC++の機能が「constexpr」です。 本特集では、constexprの魅力を紹介します。 日経ソフトウエア Amazon.co.jp: 日経ソフトウエア 2014年 05月号: 日経ソフトウエア: 本 constexprの紹介記事だが、入門から実装技法、Sproutライブラリの紹介からコンパイル時レイトレーシングまで、きわめて幅広い範囲を網羅している。 この内容を8ページ(見開き4ページ)に圧縮する
この記事は、C++ Advent Calendar 2013 の参加記事です。 前回は 西山信行 さんの記事でした。 まもなく C++14 時代が到来しようとしている。 ただでさえ実用的な言語機能である constexpr が C++14 での制限緩和によって神になろうとしている。 C++11 での constexpr の制限は、必然的に副作用のない関数型プログラミングを強制し、とても興味深いものではあった。 コードの可読性云々は主観によるのでここでは置くが、時には非効率な実装にならざるをえないケースもあったのは事実だ。 C++14 での constexpr は、古典的な実行時処理に慣れた者達にも非常に親しみやすいコードが書けるようになる。 ドラフトの直接的な内容については、すでに自分をはじめ有識者が解説を書いているので、そちらを参照するのが手っ取り早い。 constexpr 関数の制限緩
中3女子です。 とある自由ソフトウェア主義者より、C++14 に関して非常に興味深い議論を教えてもらった。 よって、今回はそれについて述べる。 2013. Do library implementers have the freedom to add constexpr? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3788.html @bolero_MURAKAMI もし、標準規格で、ある関数にconstexprが付されていないとして、ある実装では、その関数をconstexpr関数の制約に落とし込めるとして、そのような関数にconstexprを付すことは、規格違反なのか。規格準拠な拡張なのか。 2013-10-19 11:39:32 via web to @bolero_MURAKAMI @bolero_MURAKAM
中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
中3女子です。 今回は、みんな大好きユーザ定義リテラルについて。 ユーザ定義リテラルは、値(整数、不動小数点数、文字列)に対するプログラマブルなサフィックスを定義することができる機能である。 例えば糖衣構文や単位を持った値を扱うために用いられる。 { constexpr auto duration = 4_mins + 33_secs; } ユーザ定義リテラルはいらない子か ところで、このユーザ定義リテラルは、方々で微妙な子扱いされている。 というのも、そもそもユーザ定義リテラルは直観的な記述を可能とするものであるはずなのだが、その用法には一見非直観的な落とし穴がある。 例えばユーザ定義リテラルの識別子は、アンダースコアで始めなければならない。 なぜなら、アンダースコアで始まらないサフィックスは、すべて予約されているからだ。 プログラマがアンダースコアで始まらないユーザ定義リテラルを定義し
※これはエイプリルフール記事です C++1yでは、レイトレーシングやパーサコンビネ―タや音声合成が、標準ライブラリに含まれることが決定している。 もちろんこれらはconstexprで実装され、コンパイル時に実行することができる。 しかしながら、C++11のconstexprではあまりに制限が多いため実装が困難である。 現在C++標準化委員会では、constexprの制限を大幅に緩和すべく提案がなされている。 言うまでもなくこれらの提案は、コンパイル時レイトレーシングのパーサコンビネ―タや音声合成を実装するためのものである。 その次のC++2z(仮)では、更にコンパイル時フォトンマッピングやコンパイル時ウェーブレット変換、コンパイル時動画編集などが追加される予定だという。 さて今回は、constexprの制限緩和を提案するN3597を翻訳してみた。 中3女子レベルの英語力によるものなので、著
中3女子です。 USBメモリを「USB」と略す人間がいることは、まったく恥ずべきことであり、彼らは石もて追われるべきである。 一方、USBメモリを「USB」と略す人間らを批判し、石を投げる者もいる。彼らこそ祝福されるべき者達である。 ここでは、なぜUSBメモリを「USB」と略す人間が石もて追われるべきかを解説する。 もし、ここに書かれていることに納得できない者は、たとえUSBメモリを「USB」と略すべき*ではない*と考える人間であっても、彼らと同様に腹を切って死ぬべきは当然であり、また、中3女子がそういう人間を当然、地獄の火の中に投げ込むものである。 USB とは、シリアルバス規格である Universal Serial Bus の略称である。 けして、USBポートに接続して動作する、半導体メモリからなるストレージのことではない。 略称の問題は責任を求め、追求することによってしか正しくでき
中3女子です。 constexpr本を執筆しようと思い立った。 constexpr について、言語機能、用途、歴史的経緯、そして実装技術の観点から詳細に解説した本である。 動機 C++本のうち、例えば template や template ライブラリについて解説した本は探せばいくらでもある。 「Moderrn C++ Design」のような古典的名著から、「C++テンプレートテクニック」のような日本人の著作まで、バイブルと呼ぶべき本が多く存在する。 偉大なプログラマ達が《発見》し発展させたテンプレートメタプログラミングといった技法を、現代のわれわれは当たり前のように学ぶことができる。 解説サイトも沢山ある。ネット上には一線級の C++ プログラマの書いた技術情報とコードが溢れている。 たとえ英語が全く使えない者でも、ネット環境と最低限の検索能力さえあれば、template に関する日本語
※これはネタ記事です ※この記事の内容をコピペしたり参考にすることで、HDDが初期化されたり、鼻から悪魔が出たり、遠隔操作ウィルス事件の犯人として逮捕されたとしても、筆者は一切責任を負いません C++ のソースコードで、変数やメンバ関数の宣言に const がないということを否定的にとらえる人もいるかと思います。 特にローカル変数にもどんどん const を付けていこうというような信条を持った const教信者の人にとっては、const がないということが不安材料として目に映ることが多いのではないかと思います。 けれども、const がないということは、本当に素晴らしいことです。 const がないことによって、たくさんの面倒から解放されるからです。 どのような時点でも代入できる まず基本的なこととして宣言に const がなければどのような時点でも代入できるということです。 つまり、定数
中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
以前話題になり批判が盛り上がった件の「天王寺区広報デザイナーの募集」について、 イラストレーターの方による論評を見かけたのですが、ここでは芸術家の立場からの再反論をしたいと思います。 makion!log - ユーレカの日々[19]「デザインはなぜ無報酬とされたのか」 引用: 「設計」と「芸術」をいっしょにしてはいけない。「奉仕」と「ボランティア」をいっしょにしてはいけない。この違いを共通認識できれば、その先にもっと面白い世界が待っているだろう。 上記記事を自分なりに要約すると、「デザインとは設計であり、芸術とはまったく別物である。芸術とは、本来それで対価を得られるものではない。だが設計に対価を払わないのはおかしいし、デザインと芸術を混同したところに件の募集の誤謬があった」という主張がなされている。 僕はこれに反論しようと思う。 念のため断っておくが、僕は「無報酬で仕事をする」という立場に
中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
本棚を少し整理した折りにふと思いついたので、個人的ライトノベル傑作選をリストにしました。 どれも完成度と面白さで文句無しなので、友達に推薦しても喜ばれること請け合いです。 ついでに内容を一行に纏めたので、未読の人は参考に、この機会に手に取ってみてはどうでしょう。 タフガイ枠 東出祐一郎 『ケモノガリ』 変形武装車椅子。 賀東招二 『コップクラフト』 だが全世界のあらゆる日本人の中で、おまえ一人だけはジャップだ。タイニー・タイニー・ファッキン・ジャップだ。 虚淵玄 『アイゼンフリューゲル』 航空機開発ドキュメンタリー。 SF枠 うえお久光 『紫色のクオリア』 主人公が銀の鍵の門を越えて外なる神になる。 秋山瑞人 『猫の地球儀』 ガリレオ・ガリレイ vs アーネスト・ホースト。 学園枠 江波光則 『パニッシュメント』 学園版ドストエフスキー。 田中ロミオ 『AURA 〜魔竜院光牙最後の闘い〜』
「constexpr を使うべき5の理由」の連載をひとまず終えたので、記事の一覧をここにまとめておきます。 また、その他の資料や情報へのリンクを載せておきますので、更に興味あるという方は読んでみるのもよいでしょう。 constexpr を使うべき5の理由 1.定数を明示的にコンパイル時定数にする なぜあなたは const 修飾よりも constexpr 指定をするべきか。 2.定数を返す関数をコンパイル時定数にする 「市民、あなたは constexpr ですか」 「もちろんです、C++。constexpr であることは市民の義務です」 3.副作用がないことを保証する 参照透明な世界に行きたい。 4.あのうんざりするテンプレートメタプログラミングによる数値計算からはもはや解放された 型には TMP、値には constexpr。 5.必要なものをなるべく早く用意しておくために 「C++ のこと
「constexpr を使うべき5の理由」ひとまず最終回です。 コンパイル時に計算ができると聞いて、誰もがまず思い浮かべる用途は、おそらく、実行時に必要となる値をあらかじめ計算しておくというものでしょう。 5.必要なものをなるべく早く用意しておくために 何度も繰り返し同じような計算を行い、しかも実行速度が要求されるような場合(例えばゲームなど)では、最適化のために 自明な計算をあらかじめ行っておいて結果をテーブルに保持しておくことがしばしばあると思います。 非常にシンプルな例として、度数法で [0 .. 90) の範囲の正弦値を保持するテーブルを考えてみます。 #include <cmath> double degree_sin_table[90]; void init_table() { const double pi = 3.141592653589793238462643383279
「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の理由」です。 今回は、関数に対する constexpr 指定のもう一つの意味について取り上げます。 3.副作用がないことを保証する 「ねむらなくてもつかれないくすり」に副作用はあるのでしょうか。疲労をポンと感じなくさせてくれるような気はしますが。 ドラえもんがもし「副作用なんてないよ」と言ったとしてもちょっと信用なりません。 物事にはちゃんとした「保証」が必要です。 関数に対する constexpr 指定は、実装に多くの制限を課すことでもある。 constexpr 関数の中では、ローカル変数の定義や、代入などの操作もできない。 基本的に、同じ引数による呼び出しに対しては同じ値を返すような実装しかできない。 そうした制限は、逆に言えばその関数の参照透明性を保証することでもある。 参照透明でない関数は、以下のようにグローバルな状態を変更する可能性が
引き続き、「constexpr を使うべき5の理由」です。 ここでは、できるかぎり関数に constexpr を付けることが如何に C++er の義務であるかを示します。 2.定数を返す関数をコンパイル時定数にする #include <limits> constexpr auto v = std::numeric_limits<double>::max(); std::numeric_limits は、標準ライブラリで constexpr が使われた例として最も有名なものの一つでしょう。 C++03 では浮動小数点型の定数を定義することできなかったため、numeric_limits::min/max を関数として定義せざるをえず、 関数であるがゆえその値をコンパイル時定数として使うことができなかった。 C++11 では関数が constexpr 指定されたため、返値をコンパイル時定数として
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++
コンパイル時離散フーリエ変換(DFT) Sprout.Numeric.DFT は、constexpr DFT アルゴリズムを提供します。 https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/numeric/dft DFT は周波数解析などに用いられますが、ここでは詳しくは述べません。 とりあえずサンプルコードを見てください。 単純な正弦波の DFT #include <iostream> #include <fstream> #include <sprout/array.hpp> #include <sprout/pit.hpp> #include <sprout/complex.hpp> #include <sprout/numeric/dft.hpp> #include <sprout/range/adaptor.h
本記事は、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 のコードを読
これは、Sprout.Darkroom ライブラリの constexpr レイトレーサーでレンダリングした画像です。 画像サイズは 512×512 pixel。 もちろん画素データはすべてコンパイル時に生成され、ファイル出力のみが実行時に行なわれています。 光源は手前右側にあり、手前の青色がかった球から奥の赤色がかった球へ落ちる影や、 反射による球形の映り込みも確認できると思います。 レイトレーシングの基本的なアルゴリズムはとてもシンプルです。 視点から各ピクセルを通る光線を飛ばして、ベクトルが オブジェクトと交差する部分の拡散光と反射光の成分を得るだけです。 さて、ではこの Sprout.Darkroom が constexpr でどう実装されているか見てゆくことにしましょう。 とても明快で解りやすい実装です。 なお Sprout.Darkroom は未だ開発途上のライブラリであり、扱え
本記事は、C++11 Advent Calendar 2011 の5日目の記事です。 本稿では C++11 の新機能である constexpr について書きます。 まず最初にお断りしなければならないのは、この記事は constexpr そのものについて詳しく解説したり、 導入の一助となるべく書かれたものではないということです。 そのため、constexpr を使い慣れない方にとっては何を書いているか全く解らないという事があると思います。 ひとえに自分の説明能力不足と趣味によるものであり、constexpr の責任ではありません。 どうか諸兄がこの記事をもって『constexpr は全く理解に苦しむもので使いがたい』という感想を抱かぬよう願ってやみません。
このページを最初にブックマークしてみませんか?
『ボレロ村上 - ENiyGmaA Code』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く