Rokiのチラ裏

学生による学習のログ

C++

モナドの概念をC++に導入して冗長なエラーハンドリングを回避する

C++

モナドの概念をC++に導入する事についての Jonathan Boccara 氏による投稿のシリーズを見て、興味深く感じたので、個人的なメモ。尚ソースからは若干コードなどが改変されているところがある。 さて、この具体的な方法は、新たに関数を作成する場合と、既存…

C++20 進捗

C++

先日、ISO C++委員会は、カナダのトロントで次の国際標準であるC++20の作業を開始し、技術仕様の開発が続かれた。C++ 20ドラフトには、以下の機能が追加された。 Concepts Explicit generic lambdas _VA_OPT_ Default bit-field initializers Fixed const-…

最近 srook/cxx17/mpl/any_pack に加えた機能

C++

テンプレートパラメータにautoを使える喜びを噛み締めて遊ぶ - Rokiのチラ裏 にて取り上げてから、いくつかの機能を追加したのでその紹介をしてみる。 cos table [追記: any_pack によるコンパイル時コサインテーブルの構築。これは、srook/cxx17/mpl/any_pa…

stack overflow からの小ネタメモ #2

C++

前回。 stackoverflow.com 質問者は、void_t detection idiom によるSFINAEを試行している。void_t には、確かにテンプレート型に依存するパラメータが渡されているが、C++14 N3936 [temp.alias] を参照すると、テンプレートパラメータのエイリアステンプレ…

JPEG エンコーダ書いた

以前、JPEGに関する画像圧縮技術やデータ構造などついて学んだので、折角だし自分で作ってみようと思い、フルスクラッチで書いて見た。といっても、性能自体はそんなに良いものではないと思うし、簡単のために色々と制限を設けているので実用的ではないと思…

stack overflow からの小ネタメモ

C++

stack overflow で得たちょっとした小ネタをメモがてら羅列してみる。 stackoverflow.com 質問は、ざっくり書くと、ラムダを関数ポインタに変換する明示的な記述なしでそのような事ができる方法はあるか?であるが、これに対して operator+ を適用すると、変…

k-meansクラスタリングで遊ぶ

k-meansがディスられていたので、取り敢えずどんなもんかと実装した。 exp: #include<srook/k_means/k_means.hpp> int main() { srook::k_mns::k_means km("data",3); // km.set_initial_point(Point{2.0,90.0},Point{5.0,50.0}); // initial centerの独自設定も勿論可能 km.clustering(</srook/k_means/k_means.hpp>…

Default constructor improperly invoked in C++1z mode in GCC 7.1.0

C++

※5/16追記 私の推測では、C++14とC++17間で、[expr.type.conv]の文面に差異がある*1という事実の基の意見でしたが、[expr.type.conv]に該当しない場合でも発生する事を確認したため、議論がややこしくならないよう、内容を全て取り下げ、タイトルを変更しま…

テンプレートパラメータにautoを使える喜びを噛み締めて遊ぶ

C++

次期C++標準C++17では、テンプレートパラメータにautoキーワードを用いる事ができる。この機能により、型に縛られる事なく定数、リテラルをコンパイル時に扱う事ができるので、Variadic templatesで遊ぶのが好きな人からすると中々良い機能なのではないだろ…

TMP によるコンパイル時ハフマンエンコーダー(Compile time huffman encoder)

何となく書いて見た。テンプレートメタプログラミングによって、コンパイル時にハフマンツリーを構築し各記号を符号化して生成する。 以下のサンプルコードで標準出力以外は全てコンパイル時に行われる。 exp: #include<srook/mpl/cxx17/huffman_coding/huffman_encode.hpp> #include<iostream> #include<boost/type_index.hpp> template<class T> inline v</class></boost/type_index.hpp></iostream></srook/mpl/cxx17/huffman_coding/huffman_encode.hpp>…

Effective tuple algorithm

C++

下書きに眠っていたので投稿。タプル生成に関するアレコレを書いた。主に個人的にBoost.fusionで納得のいかないものを実装。 分割 たまにやりたい時がある。一々記述するよりは書いてしまった方が良いだろう。 exp: #include<tuple> #include<srook/tuple/algorithm/split.hpp> #include<srook/algorithm/for_each.hpp> #include<iostream> int</iostream></srook/algorithm/for_each.hpp></srook/tuple/algorithm/split.hpp></tuple>…

ランダムアクセス可能な全ての範囲を無駄なくベクトル演算する

C++

※ 2018/3/11 ライブラリ整理より当機能は削除した。 一々コンテナ毎にExpression templateを記述するのはバカバカしいので、書いてしまった。 ご覧の通り、Expression templateによって式構造を保存して遅延実行を行うため、範囲の無駄な一時オブジェクトは…

index_sequence algorithm

C++

variadic templateへの操作は以前書いたが、index_sequenceも同じように扱えるので書いた。現段階では以下に記載されているアルゴリズムらが実装済みである。 以下のようにテストしてある。

コンパイル時のシーケンス生成は時が経って簡単になった

C++

偶然見つけた以下のエントリ。 cpplover.blogspot.jp saito.hatenablog.jp 2010年...あれから時は経ち、いとも簡単にコンパイル時のシーケンス生成は簡単になった。 #include<srook/mpl/constant_sequence/equ_sequence.hpp> #include<srook/mpl/constant_sequence/algorithm/transfer_array.hpp> #include<iostream> for(auto&& value:srook::constant_sequence::transfer_array…</iostream></srook/mpl/constant_sequence/algorithm/transfer_array.hpp></srook/mpl/constant_sequence/equ_sequence.hpp>

Line Notify APIで遊ぶ

仕事関連の作業や自作ライブラリ開発等の合間に、息抜きとして何かお家ハック的な別の事で遊びたかったのだが、少し良い遊び道具が見つかったので一つ。 Line NotifyというLine社提供のapiがある。これが何なのかについては、公式ページに詳しくあるので参照…

Tuple-based for loops

C++

あまり体調が良くないのだが、適度に頭を使わなくても書けるネタを見つけたのでアップロード。P0589R0にインスパイアされて、そういえば書いておくと楽だろうなと今頃思ったので自分でも書いた。tupleの展開には、いつも再起したりindex_sequence使ったりapp…

Srook range adaptor and Srook range pipe algorithm

C++

※ 2018/3/11 ライブラリ整理より当エントリ内で紹介されている一部機能は削除した。 Srook Range AdaptorとSrook Range Pipe AlgorithmはSTLアルゴリズムとその他諸々の機能をイテレータアダプタによる効率的なアクセスと、パイプライン記法をサポートさせた…

パイプラインset_segregate

C++

※ 2018/3/11 ライブラリ整理より当機能は削除した。 set_segregateをパイプライン記法で。まあラップしただけ。 以下のように使う。 std::vector<int> left = boost::irange(0,9) | srook::adaptors::copied, right = boost::irange(7,19) | srook::adaptors::cop</int>…

iterator requirementsにassignableを要求される事による問題

C++

※追記 当エントリは「STLコンテナの気まぐれな実装によってiteratorをassignされる事による問題」というタイトルであったが、これは気まぐれな実装ではなく、標準の文面に規定されたルールの範囲内での話であったため、誤った解釈に基づくようなタイトルや文…

brainf**k インタプリタジェネレータ

C++

何だか凄く早い時間に起きてしまい、特にやることもないのと、最近アニメのセリフをbrainfuckの命令語に置き換える遊びが再発しているので、ジェネレータというかライブラリとも言えぬ小さいヘッダを書く事にした。 こう使う。一応元ネタさんと同じ命令語で…

あらゆるSTLコンテナをあらゆるSTLコンテナへ一発変換する(連想配列などを除く)

C++

range adaptorライブラリを書いていて、copiedがあるのだから、集合の種類を指定できても良いだろうと思い、実装する事にした。 以下のように使える。 auto v = boost::irange(0x41,0x47) | srook::adaptors::to_range<std::vector>(); // boost::irangeと併用可能 auto l</std::vector>…

C++14までの標準規格実装に準ずる厳密なhas_iterator

C++

void_t detection idiomのエントリなどから何度か当ブログで登場している、イテレータを持つtypeであるかを判別するメタ関数has_iteratorであるが、これまでのエントリでは以下のような実装を示してきた。 template<class,class=std::void_t<>> constexpr bool has_iterator_v=std::fal</class,class=std::void_t<>…

Intel Code Modernization 2017に参加した

Intel Code Modernization 2017に参加した。Intel流のParallel Computingについての情報やそれに対する知見を得た。その際に個人的に印象深かったAVX512命令であるが、当然ながら今現在でその命令に完全対応したコンシュマー向けのアーキテクチャは存在しな…

swap of variadic templates packages

C++

オレオレライブラリ、Srook C++ Librariesでは、Variadic templateを端的なpackで型情報を保持している。 // simply pack implemention template<class...> struct pack{}; かの有名なAndrew Koenig氏は、swapは基本的な操作であると述べている。 よって、Variadic tem</class...>…

Amazon dash buttonでmotionのオンオフ

動機 以前頂いたVostro 1540の使い道をこれまで色々と試行錯誤した結果、自宅内のLANを用いた様々な用途でのサーバーとして稼働させるという方向性で落ち着いた。最近はその用途の一つとして、motionという動体検知ユーティリティツールを用いた自宅内の監視…

C++11でのムーブキャプチャをシミュレート

C++

C++11の文法内ではラムダ式の構文でムーブする事はできない。 auto ptr=std::make_unique<int>(0); [a=std::move(ptr)](){}(); // From C++14 ググると様々な方法(コピーキャプチャした際にムーブを行わせるラッパー等)が検討されている。その中の1つの方法として</int>…

同じ型が入った std::tuple を楽に書きたい

C++

同じ型が入った std::tuple を楽に書きたい - Qiitaというようであれば、オレオレライブラリsrook.mpl.variadic_playerでも、より簡単に記述できますよ〜、という紹介。 #include<srook/mpl/variadic_player.hpp> #include<boost/type_index.hpp> #include<iostream> #include<tuple> int main() { using int6_tuple_type = // int型</tuple></iostream></boost/type_index.hpp></srook/mpl/variadic_player.hpp>…

例題メモ

問題を作成したのでそのメモ。 Q 整数 という数列がある。その数列中からいくつかを選び、その和を とする。 任意の整数 、 、 を入力(任意の数値が設定できるのであれば何でもいい)し、上記の関係の数列であるか判別しなさい。 解法 この問題の解法は、BFS…

P0145R3の訳

・ツイッターで出題した未定義問題のお詫びと調査と解説について - paiza開発日誌 上記のように少し話題になっていたので、P0145R3の訳をざっくり書く事にした。 Abstract and Introduction そもそもP0145R3とは何についてのpaperなのか。 This paper propos…

fizzbuzzタプル

C++

「fizz型、buzz型、fizzbuzz型を作り、fizzbuzz問題の規則に準じたタプル型を、コンパイル時に生成しなさい」という問題を出して見たので、その解答コードを以下に示す。 C++では単純なコンパイル時fizzbuzzとvariadic templateに対する少しの操作が出来れば…