Rokiのチラ裏

学生による学習のログ

C++

式によるSFINAE

C++

C++11時代からある話題だが...。置き換え失敗はエラーにあらずで有名なSFINAEを、式によってコントロールする手法。 例えば、二つの引数を差し込む事のできる関数を定義するとする。しかし、渡したいのはイテレータか生ポインタのみであり、それ以外の値を受…

Duktapeを使ってC++コードとECMAscriptをブリッジさせる

導入 % wget http://duktape.org/duktape-1.5.1.tar.xz % tar xvfJ duktape-1.5.1.tar.xz % make -f Makefile.cmdline % ./duk -e "print('Hello duk')" Hello duk 機能テスト Ecmascriptのアルゴリズムや機能をDuktapeで利用する事ができる。 % ./duk test_…

Rangeアルゴリズム関数に対するReverseアダプタ

C++

boost.range。 #include<boost/range/algorithm.hpp> #include<numeric> #include<vector> int main() { std::vector<int> v(10); std::iota(std::rbegin(v),std::rend(v),0); boost::sort(v); } STLが各要素に重きを置いた設計であるのに対して、Boost.rangeは、rangeを1単位として考え重きを置いた設計である</int></vector></numeric></boost/range/algorithm.hpp>…

Quoted Strings Library Proposal

C++

知らなかったので自分用メモ。 #include<sstream> #include<string> #include<iomanip> #include<cassert> int main() { using namespace std::string_literals; std::stringstream ss; std::string original="foolish me"; { std::string round_trip; ss<<std::quoted(original); ss>>std::quoted(round_trip); assert(orig</std::quoted(original);></cassert></iomanip></string></sstream>…

STL Tutorial and Reference Guide,Second Edition C++ Programming with the Standard Template Library #3

前回から続く。このエントリーは以下の書籍を参照している。 STL―標準テンプレートライブラリによるC++プログラミング 第2版作者: ディビッド・R.マッサー,アトゥルサイニ,ギルマー・J.ダージ,David R. Musser,Atul Saini,Gillmer J. Derge,滝沢徹,牧野祐子…

STL Tutorial and Reference Guide,Second Edition C++ Programming with the Standard Template Library #2

前回から続く。このエントリーは以下の書籍を参照している。 STL―標準テンプレートライブラリによるC++プログラミング 第2版作者: ディビッド・R.マッサー,アトゥルサイニ,ギルマー・J.ダージ,David R. Musser,Atul Saini,Gillmer J. Derge,滝沢徹,牧野祐子…

STL Tutorial and Reference Guide,Second Edition C++ Programming with the Standard Template Library #1

一度全て通して読み終わっている書籍なのだが、こういった標準仕様に関わる書籍は何度読んでも私は個人的に楽しいので、なんとなく、今一度通しで読んでいる。 STL―標準テンプレートライブラリによるC++プログラミング 第2版作者: ディビッド・R.マッサー,ア…

make_elements_string

C++

コンテナの要素を全て出力したい事がよくある。一々全て出力するrange based forを書くのは面倒だ。ただ全ての要素を出力するだけなのだから、ネット上のどこかに落ちていそうだが、なんだか見当たらない。 そんなわけで、私は3年前ぐらいに、mikoという名前…

tupleに対してfor_each

C++

ここ数年のC++の言語仕様の拡張や発展はとても活発だ。そんな中、筆者が2~3年近くC++に触れていなかったのは、少し失敗したなと、個人的に日々感じる。 tupleについても、同じ動作を全ての各要素に対して実行する方法が、その2~3年の間には既にあった。 #inc…

C++1zの新機能をまとめたスライドと高校生向けの理解度調査問題

母校の高校の方で、プログラミングをテーマに、私が授業を持つ事となった。その件に関しての会議がこのエントリを執筆している後日にあるため、スケジュールや内容は、はっきりとはまだ定まっていない。 ただ、授業の1つの案として、ここ何日かの間はC++1zの…

tuple展開も容易になった時代

スライドを作っていて色々と文書を漁って、今頃気付いた。apply() call a function with arguments from a tuple (V3) いつの間にこんな文書が...二年以上も前じゃないか。 #include<experimental/tuple> #include<string> #include<functional> inline void f(int,float,std::string&&){} int main()</functional></string></experimental/tuple>…

Ubuntu on OpenGL + GLUTで遊んでみた

なんとなく弄りたくなった。導入。 % sudo apt-get install freeglut3 freeglut3-dev 取り敢えず、空のウィンドウを出力してみる。 #include<GL/glut.h> int main(int argc,char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("</gl/glut.h>…

clang HEAD 4.0.0 tupleにarrayを初期化、代入できる?

規格書(N4606 § 20.5.2)には載っていないが、Wandbox上でのclang HEAD 4.0.0では、以下のコードが通る。 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ std::tuple<int,int>(std::experimental::make_array(42,42)); まずヘッダーファイルを見てみないとなんとも言えないので、実機</int,int>…

最新版Clangのビルドの作業ログ

普段からGCCばかり使うので、Clangのアップデートを怠っていた。 Clang - Getting Startedの通りに実行するだけだ。一連の流れをスクリプトに起した。 #!/bin/zsh emulate -R sh sudo apt-get build-dep -y llvm clang sudo apt-get install -y subversion c…

Ubuntu 16.04 LTSを自宅デスクトップ機にデュアルブート設定で入れたログ

自宅のタワーPCにUbuntu16.04LTSを入れた。今も、そのUbuntu 16.04から、ブログを投稿している。まず、インストールして、スクリプトを走らせて一通り設定したが、動作がかなり安定している。しばらくLinuxを触っていなかったので(Ubuntuなるディストリビュ…

left arrow operator(<-)を引数付きのメンバ関数にも対応してみた

ツイッターから見させて頂いたこちらのエントリ。 http://www.atnnn.com/p/operator-larrow/内容としては、クラスのポインタを持っていて関数を呼び出したい時、rigth arrow operatorを用いる事でそのメゾットを呼び出す事ができる。では、関数ポインタがあ…

for文でのpre-incrementとpost-incrementはどちらが早いか

C++

Teaching Assistantをしていて、こういった質問をしばしば受ける。このエントリタイトルの問題は周知の事実なので、書く必要もない気がするが、自分が伝える上でどのような例を出して説明すると、他人が理解しやすいかを残しておきたいので、綴ろうと思う。 …

Propose to adopt make_array into the IS

C++

C++標準化委員会の文書:Propose to adopt make_array into the IS make_arrayを規格に導入する提案。 auto ar=std::make_array(1,2,3); // std::array<int,3> ar{1,2,3}; 折角なので、実装してみた。 namespace std{ template<class... Args> constexpr decltype(auto) make_array</class...></int,3>…

C++03とC++11以降のright shift operator互換性の問題

C++

C++03まででは>>の記述は全てrigth shift operatorとコンパイラに解釈されていたため template<class _Tp>struct X{}; X<X<int> >(); とテンプレートの入れ子記述を示すためにスペースを空けなければならなかったが、C++11以降は解釈を変更したためスペースなしでも通る。これ</x<int></class>…

A byte type for increased type safety

C++

stackoverflow.com をぼんやり見ていたのだが、この問題は直ぐに解決されるだろう。 C++標準化委員会の文書:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0257r1.pdf 今までchar,signed char,unsigned charによって1バイトを表現する事が出来…

Unqualified enumerators in case labels

C++

標準化委員会の文書:Unqualified enumerators in case labels switch文内でスコープ解決を行っているコード。 enum struct foo{bar,baz}; namespace n{ enum n_foo{pub,bar,tavern}; }; auto f(const foo& f,const n::n_foo& n_f)->const std::pair<int,int>&& { std</int,int>…

C++17 std::array 規格によりほぼconstexpr化

C++14までではレガシー配列とstd::initializer_list*1がconstexprに対応していた*2が、C++17以降、std::arrayはfillとswapメンバ関数以外の全てを、constexpr化するとの事。 #include<array> template<class _Tp> using Container_value_t=typename _Tp::value_type; template<class _Tp> </class></class></array>…

std::size_tに-1を代入した場合の挙動

C++

値として-1をsize_tなどのunsigned integerへ代入(下記コードでは初期化)した時、同型の最大値となるとの事。また、その内容が規格として保証されているとの事。 constexpr std::size_t max=-1; // max==ULLONG_MAX in 64bit constexpr unsigned int ov=max+…

データ型の範囲

int main() { using ullint=unsigned long long int; using ulint=unsigned long int; std::cout<

C++を思い出す・・・#6

C++

メンバ関数ポインタ、メンバ変数ポインタを記述する際のシンタックスを忘れているのでメモメモ。 struct X{ const unsigned int x=999; const unsigned int f()const noexcept{return x;} }; int main() { { const unsigned int (X::*ptr_f)()const noexcept…

C++を思い出す・・・#5

C++

今回の話題はPointer variableがデータメンバとして定義されている場合のデフォルトコピーコンストラクタの挙動について。ヤバイ。超基礎的な事忘れてる。生成されるデフォルトコピーコンストラクタと代入演算子がメンバのポインタ変数に対してシャローコピ…

vtableを使わず関数アドレスを解決させてvirtual functionを呼びだす

通常C++プログラマがvirtual functionを宣言する理由は、virtualメソッドへの関数ポインタが格納されているvtableを暗黙に作り出させ、動的なポリモーフィズムを実現させるためである。 しかし、vtable経由で動的に関数を間接的に呼び出すという事は、コンパ…

リンク時に配列とポインタによる型の不一致でエラーを吐いてくれるか

// a.cpp int global_array[1]; extern void access(); int main() { global_array[0]=10; // 10 というアドレス値として扱われてしまう予定 access(); } // b.cpp extern int *global_array; void access(){global_array[0]=1; // 書き込もうとする} 各ファ…

七夕でしたね。

七夕という事で...無意味に作ってみた。 pic.twitter.com/xKQlNHrN40— 五味 拓樹 (@530506) 2016年7月7日 何事もありませんように。

C++を思い出す・・・#4

C++

このシリーズ何だか久しぶりな気がする。今回は、知ってはいるものの、なんだかぼんやりしているものをメモしてみる事にする。 特殊メンバ関数のdefault/delete宣言 クラスを定義した際に暗黙定義される特殊メンバ関数を制御するための命令。defaultは暗黙定…