ナウなヤングにバカうけのイカしたタグ付き共用体

ナウなヤングに
バカうけの
イカした
タグ付き共用体
自己紹介
でちまる
http://libdechimal.so
https://twitter.com/decimalbloat
パワポで生産性が3倍,更に最新バージョンの2016だからUXが5倍,すなわ
ち100倍の資料作成力だ.
タグ付き共用体とは
struct u {
int which;
union {
hoge x;
fuga y;
piyo z;
};
};
共用体に今入ってる値の種類を表わすフラグを付けたもの
今回はこれをめっちゃモダナイズした
リポジトリ
https://github.com/dechimal/TaggedUnion
コード例のprefix
using namespace desalt::tagged_union;
template<typename ...Ts>
using u = tagged_union<Ts...>;
基本的な機能
基本
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
// あとコピーとかムーブとか
同じ型どうしでも合併できる
u<int, int> x{_0, 42};
x.get(_0); // 42
x = {_1, 142};
y.get(_1); // 142
ディスパッチ
u<hoge, fuga> x{_0, hoge{}};
auto s = x.dispatch([] (tag<0>) {
return “hoge";
}, [] (tag<1>) {
return “fuga";
});
std::cout << s << std::endl; // hoge
再帰
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
コピー
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する.
変換
struct hoge {};
struct fuga : hoge {};
u<int, fuga> x{_1, {}};
u<long, hoge> y = x;
要素の数が同じで,対応する位置の要素が全て変換可能なときに変換可能.
色々な型
非負整数 (こう度な政治的判
断に基づく表現)
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
リスト
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));
});
}
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>
>;
Bottom
using botom = u<_>;
この型の有効な値は得られない.
しかし,(コピー/ムーブ)(構築/代入)および破棄はできる.
bottom型を戻り値とする関数の呼びだしは,return以外の方法でしか戻って
こないか,決して制御が戻らないことを表現するのに使える(実際に使って便
利とは言っていない).
[[noreturn]]との違いは,例えばu<hoge, bottom>などという型で,部分的に
制御が戻ってこない場合があることを型上で表現できる(実際に表現して便
利とは言っていない).
高度な機能
不動点コンビネータ
さっき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);
})));
不動点コンビネータ
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(…)と
同じ関数である.
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でやっているので異なる型を返せる.
static if
::static_if([] (auto dep, typename decltype(dep(T{}))::hoge * = {}) {
…
}, [] (auto) {
…
});
Tがhogeという名前でメンバ型があるかどうかで分岐する.
最初の引数はdependent type/expressionを作るためのもので,static ifの中
で渡される.これをなくして単に
[] (typename T::hoge * = {}) {}
とするとSFINAEしないで::hogeがないというコンパイルエラーを引き起こす.
相互再帰
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;
となる.
代入の例外安全性
コードごらんなさい.
https://github.com/dechimal/TaggedUnion/blob/7bbb376304913eaecf6e8e0
168e215a62c0dede3/tagged_union.hpp#L312
1 de 24

Recomendados

C++コンパイラ GCCとClangからのメッセージをお読みください por
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
4.7K vistas12 diapositivas
Emcjp item21 por
Emcjp item21Emcjp item21
Emcjp item21MITSUNARI Shigeo
2.3K vistas12 diapositivas
templateとautoの型推論 por
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
15.2K vistas22 diapositivas
C++でHello worldを書いてみた por
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
6.8K vistas22 diapositivas
C++14 Overview por
C++14 OverviewC++14 Overview
C++14 OverviewAkira Takahashi
11.8K vistas33 diapositivas
ゲーム開発者のための C++11/C++14 por
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
103.6K vistas157 diapositivas

Más contenido relacionado

La actualidad más candente

More C++11 por
More C++11More C++11
More C++11京大 マイコンクラブ
13.9K vistas57 diapositivas
C++ ポインタ ブートキャンプ por
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
11K vistas145 diapositivas
C++11 por
C++11C++11
C++11京大 マイコンクラブ
2.6K vistas52 diapositivas
Visual C++で使えるC++11 por
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
36.8K vistas96 diapositivas
組み込みでこそC++を使う10の理由 por
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
27K vistas32 diapositivas
Sml#探検隊 por
Sml#探検隊Sml#探検隊
Sml#探検隊Hiroki Mizuno
1K vistas61 diapositivas

La actualidad más candente(20)

C++ ポインタ ブートキャンプ por Kohsuke Yuasa
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa11K vistas
Visual C++で使えるC++11 por nekko1119
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
nekko111936.8K vistas
組み込みでこそC++を使う10の理由 por kikairoya
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya27K vistas
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜 por 勝成 鈴江
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江5.2K vistas
競技プログラミングのためのC++入門 por natrium11321
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321 32.9K vistas
Javaとかc#とか最近の言語使いのためのc++入門 por potimarimo
Javaとかc#とか最近の言語使いのためのc++入門Javaとかc#とか最近の言語使いのためのc++入門
Javaとかc#とか最近の言語使いのためのc++入門
potimarimo7.4K vistas
Effective Modern C++ 勉強会#1 Item3,4 por Takashi Hoshino
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino2.7K vistas
unique_ptrにポインタ以外のものを持たせるとき por Shintarou Okada
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada6.9K vistas
BoostAsioで可読性を求めるのは間違っているだろうか por Yuki Miyatake
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake14.3K vistas
おいしいLisp por Kent Ohashi
おいしいLispおいしいLisp
おいしいLisp
Kent Ohashi1.2K vistas
C++入門? por tsudaa
C++入門?C++入門?
C++入門?
tsudaa3.6K vistas
F#入門 ~関数プログラミングとは何か~ por Nobuhisa Koizumi
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi3.6K vistas
C++ lecture-2 por sunaemon
C++ lecture-2C++ lecture-2
C++ lecture-2
sunaemon1.4K vistas
C++11概要 ライブラリ編 por egtra
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra3K vistas

Similar a ナウなヤングにバカうけのイカしたタグ付き共用体

TypeScript 1.0 オーバービュー por
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
16.5K vistas44 diapositivas
Replace Output Iterator and Extend Range JP por
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
1.6K vistas26 diapositivas
MP in Scala por
MP in ScalaMP in Scala
MP in ScalaKent Ohashi
890 vistas30 diapositivas
20141128 iOSチーム勉強会 My Sweet Swift por
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
2.2K vistas97 diapositivas
Ekmett勉強会発表資料 por
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
948 vistas68 diapositivas
CLR/H No.35-2 por
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2Nobuhisa Koizumi
534 vistas35 diapositivas

Similar a ナウなヤングにバカうけのイカしたタグ付き共用体(20)

TypeScript 1.0 オーバービュー por Akira Inoue
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue16.5K vistas
Replace Output Iterator and Extend Range JP por Akira Takahashi
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi1.6K vistas
20141128 iOSチーム勉強会 My Sweet Swift por necocen
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
necocen2.2K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂948 vistas
すごいHaskell楽しく学ぼう-第12章モノイド- por Hiromasa Ohashi
すごいHaskell楽しく学ぼう-第12章モノイド-すごいHaskell楽しく学ぼう-第12章モノイド-
すごいHaskell楽しく学ぼう-第12章モノイド-
Hiromasa Ohashi1.6K vistas
Ekmett勉強会発表資料 por 時響 逢坂
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂16.7K vistas
すごいH 第12章モノイド por Shinta Hatatani
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
Shinta Hatatani2.2K vistas
Python standard 2022 Spring por anyakichi
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Spring
anyakichi218 vistas
テンプレートメタプログラミング as 式 por digitalghost
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
digitalghost2K vistas
Essential Scala 第5章 シーケンス処理 por Takuya Tsuchida
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
Takuya Tsuchida356 vistas
[第2版]Python機械学習プログラミング 第14章 por Haruki Eguchi
[第2版]Python機械学習プログラミング 第14章[第2版]Python機械学習プログラミング 第14章
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi305 vistas

Más de digitalghost

拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った por
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作ったdigitalghost
2.3K vistas21 diapositivas
Define and expansion of cpp macro por
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macrodigitalghost
4.2K vistas48 diapositivas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロdigitalghost
7.5K vistas21 diapositivas
君はまだ,本当のプリプロセスを知らない por
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
5.4K vistas33 diapositivas
No skk, no life. por
No skk, no life.No skk, no life.
No skk, no life.digitalghost
4.5K vistas75 diapositivas
Boost.Preprocessorでプログラミングしましょう por
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょうdigitalghost
5.3K vistas63 diapositivas

Más de digitalghost(7)

拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った por digitalghost
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
digitalghost2.3K vistas
Define and expansion of cpp macro por digitalghost
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost4.2K vistas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por digitalghost
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost7.5K vistas
君はまだ,本当のプリプロセスを知らない por digitalghost
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost5.4K vistas
No skk, no life. por digitalghost
No skk, no life.No skk, no life.
No skk, no life.
digitalghost4.5K vistas
Boost.Preprocessorでプログラミングしましょう por digitalghost
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょう
digitalghost5.3K vistas
Preprocess-time Lambda Expression por digitalghost
Preprocess-time Lambda ExpressionPreprocess-time Lambda Expression
Preprocess-time Lambda Expression
digitalghost1.1K vistas

Último

システム概要.pdf por
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
40 vistas1 diapositiva
how query cost affects search behavior translated in JP por
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JPTobioka Ken
9 vistas16 diapositivas
AIで始めるRustプログラミング #SolDevHub por
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHubK Kinzal
22 vistas25 diapositivas
onewedge_companyguide1 por
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
27 vistas22 diapositivas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
122 vistas36 diapositivas
Najah Matsuo Self Introduction por
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self IntroductionNajahMatsuo
7 vistas29 diapositivas

Último(9)

how query cost affects search behavior translated in JP por Tobioka Ken
how query cost affects search behavior translated in JPhow query cost affects search behavior translated in JP
how query cost affects search behavior translated in JP
Tobioka Ken9 vistas
AIで始めるRustプログラミング #SolDevHub por K Kinzal
AIで始めるRustプログラミング #SolDevHubAIで始めるRustプログラミング #SolDevHub
AIで始めるRustプログラミング #SolDevHub
K Kinzal22 vistas
onewedge_companyguide1 por ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE127 vistas
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 por 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦122 vistas
Najah Matsuo Self Introduction por NajahMatsuo
Najah Matsuo Self IntroductionNajah Matsuo Self Introduction
Najah Matsuo Self Introduction
NajahMatsuo7 vistas
図解で理解するvetKD por ryoo toku
図解で理解するvetKD図解で理解するvetKD
図解で理解するvetKD
ryoo toku86 vistas

ナウなヤングにバカうけのイカしたタグ付き共用体