SlideShare a Scribd company logo
Enviar búsqueda
Cargar
ナウなヤングにバカうけのイカしたタグ付き共用体
Denunciar
Compartir
D
digitalghost
Seguir
•
3 recomendaciones
•
2,265 vistas
1
de
24
ナウなヤングにバカうけのイカしたタグ付き共用体
•
3 recomendaciones
•
2,265 vistas
Denunciar
Compartir
Descargar ahora
Descargar para leer sin conexión
Ingeniería
C++14で作ったタグ付き共用体はすごい
Leer más
D
digitalghost
Seguir
Recomendados
C++コンパイラ GCCとClangからのメッセージをお読みください por
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
4.7K vistas
•
12 diapositivas
Emcjp item21 por
Emcjp item21
MITSUNARI Shigeo
2.3K vistas
•
12 diapositivas
templateとautoの型推論 por
templateとautoの型推論
MITSUNARI Shigeo
15.2K vistas
•
22 diapositivas
C++でHello worldを書いてみた por
C++でHello worldを書いてみた
firewood
6.8K vistas
•
22 diapositivas
C++14 Overview por
C++14 Overview
Akira Takahashi
11.8K vistas
•
33 diapositivas
ゲーム開発者のための C++11/C++14 por
ゲーム開発者のための C++11/C++14
Ryo Suzuki
103.6K vistas
•
157 diapositivas
Más contenido relacionado
La actualidad más candente
More C++11 por
More C++11
京大 マイコンクラブ
13.9K vistas
•
57 diapositivas
C++ ポインタ ブートキャンプ por
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
11K vistas
•
145 diapositivas
C++11 por
C++11
京大 マイコンクラブ
2.6K vistas
•
52 diapositivas
Visual C++で使えるC++11 por
Visual C++で使えるC++11
nekko1119
36.8K vistas
•
96 diapositivas
組み込みでこそC++を使う10の理由 por
組み込みでこそC++を使う10の理由
kikairoya
27K vistas
•
32 diapositivas
Sml#探検隊 por
Sml#探検隊
Hiroki Mizuno
1K vistas
•
61 diapositivas
La actualidad más candente
(20)
More C++11 por 京大 マイコンクラブ
More C++11
京大 マイコンクラブ
•
13.9K vistas
C++ ポインタ ブートキャンプ por Kohsuke Yuasa
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
•
11K vistas
C++11 por 京大 マイコンクラブ
C++11
京大 マイコンクラブ
•
2.6K vistas
Visual C++で使えるC++11 por nekko1119
Visual C++で使えるC++11
nekko1119
•
36.8K vistas
組み込みでこそC++を使う10の理由 por kikairoya
組み込みでこそC++を使う10の理由
kikairoya
•
27K vistas
Sml#探検隊 por Hiroki Mizuno
Sml#探検隊
Hiroki Mizuno
•
1K vistas
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜 por 勝成 鈴江
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
•
5.2K vistas
競技プログラミングのためのC++入門 por natrium11321
競技プログラミングのためのC++入門
natrium11321
•
32.9K vistas
Javaとかc#とか最近の言語使いのためのc++入門 por potimarimo
Javaとかc#とか最近の言語使いのためのc++入門
potimarimo
•
7.4K vistas
Effective Modern C++ 勉強会#1 Item3,4 por Takashi Hoshino
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
•
2.7K vistas
Functional Way por Kent Ohashi
Functional Way
Kent Ohashi
•
492 vistas
unique_ptrにポインタ以外のものを持たせるとき por Shintarou Okada
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada
•
6.9K vistas
BoostAsioで可読性を求めるのは間違っているだろうか por Yuki Miyatake
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
•
14.3K vistas
おいしいLisp por Kent Ohashi
おいしいLisp
Kent Ohashi
•
1.2K vistas
Nginx lua por Moriyoshi Koizumi
Nginx lua
Moriyoshi Koizumi
•
14.3K vistas
Objc lambda por matuura_core
Objc lambda
matuura_core
•
2.1K vistas
C++入門? por tsudaa
C++入門?
tsudaa
•
3.6K vistas
F#入門 ~関数プログラミングとは何か~ por Nobuhisa Koizumi
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
•
3.6K vistas
C++ lecture-2 por sunaemon
C++ lecture-2
sunaemon
•
1.4K vistas
C++11概要 ライブラリ編 por egtra
C++11概要 ライブラリ編
egtra
•
3K vistas
Similar a ナウなヤングにバカうけのイカしたタグ付き共用体
TypeScript 1.0 オーバービュー por
TypeScript 1.0 オーバービュー
Akira Inoue
16.5K vistas
•
44 diapositivas
Replace Output Iterator and Extend Range JP por
Replace Output Iterator and Extend Range JP
Akira Takahashi
1.6K vistas
•
26 diapositivas
MP in Scala por
MP in Scala
Kent Ohashi
890 vistas
•
30 diapositivas
20141128 iOSチーム勉強会 My Sweet Swift por
20141128 iOSチーム勉強会 My Sweet Swift
necocen
2.2K vistas
•
97 diapositivas
Ekmett勉強会発表資料 por
Ekmett勉強会発表資料
時響 逢坂
948 vistas
•
68 diapositivas
CLR/H No.35-2 por
CLR/H No.35-2
Nobuhisa Koizumi
534 vistas
•
35 diapositivas
Similar a ナウなヤングにバカうけのイカしたタグ付き共用体
(20)
TypeScript 1.0 オーバービュー por Akira Inoue
TypeScript 1.0 オーバービュー
Akira Inoue
•
16.5K vistas
Replace Output Iterator and Extend Range JP por Akira Takahashi
Replace Output Iterator and Extend Range JP
Akira Takahashi
•
1.6K vistas
MP in Scala por Kent Ohashi
MP in Scala
Kent Ohashi
•
890 vistas
20141128 iOSチーム勉強会 My Sweet Swift por necocen
20141128 iOSチーム勉強会 My Sweet Swift
necocen
•
2.2K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料
時響 逢坂
•
948 vistas
CLR/H No.35-2 por Nobuhisa Koizumi
CLR/H No.35-2
Nobuhisa Koizumi
•
534 vistas
Pfi Seminar 2010 1 7 por Preferred Networks
Pfi Seminar 2010 1 7
Preferred Networks
•
3.4K vistas
すごいHaskell楽しく学ぼう-第12章モノイド- por Hiromasa Ohashi
すごいHaskell楽しく学ぼう-第12章モノイド-
Hiromasa Ohashi
•
1.6K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料
時響 逢坂
•
16.7K vistas
boost tour 1.48.0 all por Akira Takahashi
boost tour 1.48.0 all
Akira Takahashi
•
2.6K vistas
すごいH 第12章モノイド por Shinta Hatatani
すごいH 第12章モノイド
Shinta Hatatani
•
2.2K vistas
初めてのSTL por HCPC: 北海道大学競技プログラミングサークル
初めてのSTL
HCPC: 北海道大学競技プログラミングサークル
•
948 vistas
DTrace for biginners part(2) por Shoji Haraguchi
DTrace for biginners part(2)
Shoji Haraguchi
•
963 vistas
Python standard 2022 Spring por anyakichi
Python standard 2022 Spring
anyakichi
•
218 vistas
大人のお型付け por Nobuhisa Koizumi
大人のお型付け
Nobuhisa Koizumi
•
1.5K vistas
テンプレートメタプログラミング as 式 por digitalghost
テンプレートメタプログラミング as 式
digitalghost
•
2K vistas
What is template por Akira Takahashi
What is template
Akira Takahashi
•
2.9K vistas
Essential Scala 第5章 シーケンス処理 por Takuya Tsuchida
Essential Scala 第5章 シーケンス処理
Takuya Tsuchida
•
356 vistas
[第2版]Python機械学習プログラミング 第14章 por Haruki Eguchi
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi
•
305 vistas
Boost Fusion Library por Akira Takahashi
Boost Fusion Library
Akira Takahashi
•
2.7K vistas
Más de digitalghost
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った por
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
digitalghost
2.3K vistas
•
21 diapositivas
Define and expansion of cpp macro por
Define and expansion of cpp macro
digitalghost
4.2K vistas
•
48 diapositivas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
7.5K vistas
•
21 diapositivas
君はまだ,本当のプリプロセスを知らない por
君はまだ,本当のプリプロセスを知らない
digitalghost
5.4K vistas
•
33 diapositivas
No skk, no life. por
No skk, no life.
digitalghost
4.5K vistas
•
75 diapositivas
Boost.Preprocessorでプログラミングしましょう por
Boost.Preprocessorでプログラミングしましょう
digitalghost
5.3K vistas
•
63 diapositivas
Más de digitalghost
(7)
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った por digitalghost
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
digitalghost
•
2.3K vistas
Define and expansion of cpp macro por digitalghost
Define and expansion of cpp macro
digitalghost
•
4.2K vistas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por digitalghost
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
•
7.5K vistas
君はまだ,本当のプリプロセスを知らない por digitalghost
君はまだ,本当のプリプロセスを知らない
digitalghost
•
5.4K vistas
No skk, no life. por digitalghost
No skk, no life.
digitalghost
•
4.5K vistas
Boost.Preprocessorでプログラミングしましょう por digitalghost
Boost.Preprocessorでプログラミングしましょう
digitalghost
•
5.3K vistas
Preprocess-time Lambda Expression por digitalghost
Preprocess-time Lambda Expression
digitalghost
•
1.1K vistas
Último
システム概要.pdf por
システム概要.pdf
Taira Shimizu
40 vistas
•
1 diapositiva
how query cost affects search behavior translated in JP por
how query cost affects search behavior translated in JP
Tobioka Ken
9 vistas
•
16 diapositivas
AIで始めるRustプログラミング #SolDevHub por
AIで始めるRustプログラミング #SolDevHub
K Kinzal
22 vistas
•
25 diapositivas
onewedge_companyguide1 por
onewedge_companyguide1
ONEWEDGE1
27 vistas
•
22 diapositivas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦
122 vistas
•
36 diapositivas
Najah Matsuo Self Introduction por
Najah Matsuo Self Introduction
NajahMatsuo
7 vistas
•
29 diapositivas
Último
(9)
システム概要.pdf por Taira Shimizu
システム概要.pdf
Taira Shimizu
•
40 vistas
how query cost affects search behavior translated in JP por Tobioka Ken
how query cost affects search behavior translated in JP
Tobioka Ken
•
9 vistas
AIで始めるRustプログラミング #SolDevHub por K Kinzal
AIで始めるRustプログラミング #SolDevHub
K Kinzal
•
22 vistas
onewedge_companyguide1 por ONEWEDGE1
onewedge_companyguide1
ONEWEDGE1
•
27 vistas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦
•
122 vistas
Najah Matsuo Self Introduction por NajahMatsuo
Najah Matsuo Self Introduction
NajahMatsuo
•
7 vistas
lt.pptx por tomochamarika
lt.pptx
tomochamarika
•
80 vistas
SSH超入門 por Toru Miyahara
SSH超入門
Toru Miyahara
•
363 vistas
図解で理解するvetKD por ryoo toku
図解で理解するvetKD
ryoo toku
•
86 vistas
ナウなヤングにバカうけのイカしたタグ付き共用体
1.
ナウなヤングに バカうけの イカした タグ付き共用体
2.
自己紹介 でちまる http://libdechimal.so https://twitter.com/decimalbloat パワポで生産性が3倍,更に最新バージョンの2016だからUXが5倍,すなわ ち100倍の資料作成力だ.
3.
タグ付き共用体とは struct u { int
which; union { hoge x; fuga y; piyo z; }; }; 共用体に今入ってる値の種類を表わすフラグを付けたもの 今回はこれをめっちゃモダナイズした
4.
リポジトリ https://github.com/dechimal/TaggedUnion
5.
コード例のprefix using namespace desalt::tagged_union; template<typename
...Ts> using u = tagged_union<Ts...>;
6.
基本的な機能
7.
基本 u<int, double> x{_0,
42}; x.which(); // 0 x.get(_0); // 42 x.get(_1); // error x = {_1, 123.0}; x.which() // 1 x.get(_1) // 123.0; x.get(_0) // error // あとコピーとかムーブとか
8.
同じ型どうしでも合併できる u<int, int> x{_0,
42}; x.get(_0); // 42 x = {_1, 142}; y.get(_1); // 142
9.
ディスパッチ u<hoge, fuga> x{_0,
hoge{}}; auto s = x.dispatch([] (tag<0>) { return “hoge"; }, [] (tag<1>) { return “fuga"; }); std::cout << s << std::endl; // hoge
10.
再帰 using tree =
u<int, std::tuple<int, _, _>>; int sum(tree const & t) { t.when([] (tag<0> n, int n) { return n; }, [] (tag<1>, std::tuple<tree, tree> const & t) { return ::sum(std::get<0>(t)) + ::sum(std::get<1>(t)); }); } tree t{_1, std::make_tuple(1, tree{_0, 2}, tree{_0, 3})}; std::cout << sum(t) << std::endl; // 6
11.
コピー u<int> x{_1, 42},
y = x; y = {_1, 0}; std::cout << x.get(_0) << std::endl; // 42 std::cout << y.get(_1) << std::endl; // 0 deep copyする.
12.
変換 struct hoge {}; struct
fuga : hoge {}; u<int, fuga> x{_1, {}}; u<long, hoge> y = x; 要素の数が同じで,対応する位置の要素が全て変換可能なときに変換可能.
13.
色々な型
14.
非負整数 (こう度な政治的判 断に基づく表現) struct unit
{}; using nat = u<unit, _>; int to_int(nat const & n) { return n.when([] (tag<0>, unit) { return 0; }, [] (tag<1>, nat const & m) { return ::to_int(m) + 1; }); } nat two{_1, nat{_1, nat{_1}}}; std::cout << ::to_int(two) << std::endl; // 2
15.
リスト template<typename T> using list
= u<unit, std::tuple<T, _>>; template<typename T, typename Z, typename F> auto foldr(list<T> const & l, Z z, F f) { return n.when([] (tag<0>, unit) { return z; }, [] (tag<1>, std::tuple<T, list<T>> const & m) { return f(std::get<0>(m), ::foldr(std::get<1>(m), z, f)); }); }
16.
JSON using json_value =
u< nullptr, bool, double, std::string, std::vector<_>, std::unordered_map<std::string, _> >; using json = u< std::vector<json_value>, std::unordered_map<std::string, json_value> >;
17.
Bottom using botom =
u<_>; この型の有効な値は得られない. しかし,(コピー/ムーブ)(構築/代入)および破棄はできる. bottom型を戻り値とする関数の呼びだしは,return以外の方法でしか戻って こないか,決して制御が戻らないことを表現するのに使える(実際に使って便 利とは言っていない). [[noreturn]]との違いは,例えばu<hoge, bottom>などという型で,部分的に 制御が戻ってこない場合があることを型上で表現できる(実際に表現して便 利とは言っていない).
18.
高度な機能
19.
不動点コンビネータ さっきnatの値をintの値に変換するために int to_int(nat)
という関数を書いた が,あれはこう書ける. n.when(::fix(::tie([] (auto, tag<0>, unit) { return 0; }, [] (auto f, tag<1>, nat const & m) -> int { return f(m); })));
20.
不動点コンビネータ n.when( ::fix( ::tie( [] (auto,
tag<0>, unit) { return 0; }, [] (auto f, tag<1>, nat const & m) -> int { return f(m); }))); tieはBoostのmake_overloaded_functionみたいなもので,複数の関数を一つ にまとめた関数オブジェクト. 実際に呼び出されるのは,tieに与えた順に探索して最初に呼び出せるもの (だったと思う). fixは不動点コンビネータで,与えられた関数を再帰呼び出しする.これはラム ダ式で再帰するために使う.上例の各ラムダ式の最初の引数が,::fix(…)と 同じ関数である.
21.
static if template<typename T> auto
has_hoge() { return ::static_if([] (auto, std::enable_if<(sizeof(T) > 12)>::type* = nullptr) { return std::true_type{}; }, [] (auto) { return std::false_type{}; }); } Tのサイズが12以上ならtrue_type,そうでなければfalse_typeの値を返す関 数. 分岐はSFINAEでやっているので異なる型を返せる.
22.
static if ::static_if([] (auto
dep, typename decltype(dep(T{}))::hoge * = {}) { … }, [] (auto) { … }); Tがhogeという名前でメンバ型があるかどうかで分岐する. 最初の引数はdependent type/expressionを作るためのもので,static ifの中 で渡される.これをなくして単に [] (typename T::hoge * = {}) {} とするとSFINAEしないで::hogeがないというコンパイルエラーを引き起こす.
23.
相互再帰 using u0 =
u<hoge, _, _r1>; using u1 = u<fuga, _, u0>; u1 x = …; これは, ◦ decltype(x.get(_0)) == fuga; ◦ decltype(x.get(_1)) == u1; ◦ decltype(x.get(_2).get(_0)) == hoge ◦ decltype(x.get(_2).get(_1)) == u0; ◦ decltype(x.get(_2).get(_2)) == u1; となる.
24.
代入の例外安全性 コードごらんなさい. https://github.com/dechimal/TaggedUnion/blob/7bbb376304913eaecf6e8e0 168e215a62c0dede3/tagged_union.hpp#L312