SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
expectedによる
エラーハンドリング
高橋 晶(Akira Takahashi)
faithandbrave@gmail.com
2015/12/05(土) Boost.勉強会 #19 東京
自己紹介
• 高橋 晶(Akira Takahashi)
• Boost.勉強会 東京の主催者
• boostjp、cpprefjpサイトのコアメンバ
• 株式会社ロングゲート所属
• システム開発、ゲーム開発、教育のお仕事などを

しています。
• 書籍:『C++テンプレートテクニック』『C++ポケット

リファレンス』『プログラミングの魔導書シリーズ』など
expectedとは
• 正常値とエラー値のどちらかが入る、汎用的な型
• 作者 Vicente J. Botet Escriba
• アイディア元は、C++ and Beyond 2012での

Andrei Alexandrescuのプレゼンテーション

「Systematic Error Handling in C++」
• リポジトリはここ:https://github.com/ptal/expected
• 標準への提案文書もGitHubにある。仕様の議論は主に、
std-proposalsメーリングリストで行われている。
話すこと
• これまでのエラーハンドリングと問題点
• expectedの概要
• expectedの仕様
お断り
• expectedは現在策定中の機能であり、正式に導入される

までに、仕様が変更される可能性があります。
• この発表では、変更される可能性の高そうなところは、

説明を薄くします。
• たとえば、「エラー型の扱い」「例外の扱い」といった

ところは、変更される可能性が高いと考えています。
Chapter 1
これまでのエラーハンドリングと問題点
expectedの解説に入るまえに
• これまでのエラーハンドリングを振り返っていきます
boolによるエラーハンドリング 1/2
• bool値によって、処理が成功したか失敗したかを

判定してきました
bool validateUserInput(string input)
{
…
return true; // 成功したらtrue、失敗したらfalseを返す

}
!
if (validateUserInput("hoge"))
// 正しいユーザー入力
else
// 不正なユーザー入力
boolによるエラーハンドリング 2/2
• 成功時に戻り値を付加したい場合は、

戻り値の型をpair<bool, T>としたり、
template <class T>
pair<bool, T> f() {
if (…成功…) return make_pair(true, …T型の戻り値…);
return make_pair(false, T());
}
• 非const参照のパラメータで返したりしていました。
bool f(T& result)
{
if (…成功…) result = …T型の戻り値…;
}
有効値と無効値によるハンドリング
• 成功したときに有効な値を返し、失敗したときに無効な値
を返す、という方法も、昔から行われていました。
int f() {
return -1; // 成功したら0以上、失敗したら0未満の値を返す
}
T* f() {
return nullptr; // 成功したら有効なポインタ、
// 失敗したらヌルポインタを返す
}
string f() {
return string(); // 成功したら非空文字列、
// 失敗したら空文字列を返す
}
optionalによるエラーハンドリング
• 有効値と無効値の統一的な表現として、
boost::optional<T>という型が導入されました。
• 整数、ポインタ、文字列といったもので、システムごと、
または関数ごとに無効値が異なる仕様になるのを防いで

くれます。
optional<int> f() {
if (…成功…)
return 42; // 成功したらT型の値を返す
else
return none; // 失敗したらnoneという特殊な値を返す
}
error_codeクラス
• OSのエラーコードを扱うことを主目的として、error_code
というクラスが導入された(Boost, C++11)
• こちらはoptionalとは逆に、エラー値か成功かのどちらか
を状態として持つ
error_code error = make_error_code(errc::invalid_argument);
if (error) // エラー
cout << error.message() << endl;
else
cout << "成功" << endl;
futureクラス
• 非同期操作の結果を読むためのクラスfutureでは、

成功値か例外のどちらかを状態として持つ。
int calc() {
if (…成功…) return 42;
throw runtime_error("failed");
}
!
future<int> f = async(calc);
try {
int result = f.get(); // 成功したら値が返され、
// 失敗したら例外が送出される
}
catch (runtime_error& e) { … }
これまでのエラーハンドリングの問題点
• optionalやerror_codeでは、正常値かエラー値の

どちらかしかとれなかった
• エラーになる原因が複数あるような場合(I/O関係でよくある)
に、「なにが原因でエラーになったか」が知りたい
• エラーになりうる操作を連続で呼び出す場合に、

「どこでどういった原因で操作が中断されたか」が知りたい

(たとえば、HaskellのMaybeモナド、SwiftやC# 6のOption)
• optionalやfutureの経験を活かして、正常値とエラー値の

両方をとれるようにしよう! => そしてexpectedへ
他言語の例
// residenceとaddress、両方あったら住所の処理をする
// いずれかがなかったら、else節が呼ばれる
if let johnsStreet = john.residence?.address?.street {
print("John's street name is (johnsStreet).")
} else {
print("Unable to retrieve the address.")
}
# 失敗する可能性のある操作を連続して記述する
# 途中で失敗したら、それ以降の関数は呼ばれない
f >>= g >>= h
HaskellのMaybeモナド
SwiftのOptional Chaining (C# 6のnull条件演算子も、?.構文)
Chapter 2
expectedの概要と仕様
expectedの概要
• expectedは、正常値かエラー値の、どちらかが入る型
template <class T, class E>
class expected;
• 処理が正常に終了したときには戻り値を取得でき、

エラーになったときには、その原因を取得できる。
• 最近のoptionalのインタフェース(emplace系)に合わせて

設計されている。futureの設計経験も反映させている。
• HaskellのMonadErrorやEitherの考え方を取り入れ、失敗する
可能性のある操作のシーケンスを、エラー理由付きで

書きやすくしている。
使い方1 - エラーが起きる可能性のある処理側
// 0割りをハンドリングする除算関数
expected<double,error_condition> safe_divide(double i, double j)
{
if (j == 0)
return make_unexpected(arithmetic_errc::divide_by_zero);
else
return i / j;
}
• 正常の場合は、T型(ここではdouble)の値を代入する
• エラーの場合は、make_unexpected()関数に

E型(ここではerror_condition)の値を渡す
使い方2 - エラーをハンドリングする側
expected<double, error_condition>
f1(double i, double j, double k)
{
auto q = safe_divide(j, k)
if(q) return i + *q;
else return q;
}
• ポインタのインタフェースで、正常かどうかの判定、および
正常値の取得ができる。
• それぞれの値の取得は、value()メンバ関数と

error()メンバ関数を使用してもよい。
使い方3 - エラーハンドリングに

より高級なインタフェースを使用する
expected<double, error_condition>
f1(double i, double j, double k)
{
return safe_divide(j, k).map([&](double q){
return i + q;
});
}
• map()メンバ関数に登録した関数は、expectedが正常値を

持っている場合に、正常値を引数として呼び出される
(expectedではなく、その中身である正常値が渡される)
• エラー値を持っている場合には呼び出されない。

(この場合は、エラー値がそのまま返される)
使い方4 - エラーの場合
expected<double, error_condition>
f1(double i, double j, double k)
{
return safe_divide(j, k).
catch_error([&](const error_condition& e) {
if(e.value() == arithmetic_errc::divide_by_zero)
return 0;
return make_unexpected(e);
});
}
• エラーをハンドリングする場合は、catch_error()メンバ関数
を使用する。expectedがエラー値を持っている場合に、

登録した関数が呼び出される。
使い方5 - 処理を連続で行う
expected<int, string> f() { return 3; }
!
f().map([](int x) {
return x + 1;
}).map([](int y) {
return to_string(y + 1);
}).map([](const string& z) {
cout << "success : " << stoi(z) + 1 << endl;
}).catch_error([](const string& e) {
cout << "error : " << e << endl;
return make_unexpected(e);
});
• エラーになる可能性のある操作を列挙し、

エラーを一括で処理する
正常値のハンドリング3種
• 正常値のハンドリングをするための関数は、map()のほかに

bind()とthen()もある。
• Haskell風に書くと、以下のような型の違いがある:
map :: (T -> U) -> [U]
map :: (T -> [U]) -> [[U]]
!
bind :: (T -> U) -> [U]
bind :: (T -> [U]) -> [U]
!
then :: ([T] -> U) -> [U]
then :: ([T] -> [U]) -> [U]
(T -> U)で、T型を受け取ってU型を返す関数。
角カッコになっているものは、expectedでラップされた型
正常値のハンドリング3種
• map()は、expectedを返したときにexpected<expected<T, U>, U>
となる。
• bind()は、expectedを返したときにexpected<T, U>となる。
• then()は、ハンドラ内でTではなくexpected<T, U>を扱う。
(future::then()由来)
optional由来のインタフェース 1/2
• emplace()メンバ関数と、そのコンストラクタ版
• 型Tのコンストラクタ引数から、

正常値を持つexpectedオブジェクトを構築する
expected<T, E> e {in_place, T_args...};
e.emplace(T_args...);
• エラー値を持つexpectedオブジェクトを構築するコンストラクタ
expected<T, E> e {unexpect, E_args...};
• なお、デフォルト構築ではE()の値を持つ。
optional由来のインタフェース 2/2
• template <class U> T value_or(U&&) &&;
• 正常値を持っている場合はそれを返し、

エラーの場合はパラメータで指定された値を返す。
• 開発リポジトリでは、エラーの場合にテンプレートパラメータで
指定された例外を送出する、value_or_throw<Exception>()メンバ
関数もある。
expected<void, E>
• expectedは、正常値の型をvoidにすることを許可している。
• このような型のオブジェクトは、map()やbind()に指定した関数が
何も返さないと作られる。
• expected<void, E>は、error_codeの代わりとしても使用できる。
// 正常値を生成する方法
expected<void, E> e {in_place};
e.emplace();
連想コンテナのキーとして使用する
• expectedは、連想コンテナのキーとして使用できるように

するために、以下をサポートしている:
• operator<
• operator==
• std::hashの特殊化
expectedの現在の状況
• expectedは、標準C++に現在あるエラー報告の仕組みである例外
を置き換えるものである。
• そのためexpectedは、現在のエラー報告の仕組みでできる全ての
要件を満たさなければならない。
• 仕様は慎重に作る必要があるため、時間がかかる見込み。
• expectedの議論は、std-proposalsメーリングリスト、および
GitHub開発リポジトリのIssuesで行われているので、

興味がある人は参加しよう。
まとめ
• expectedは、正常値かエラー値の、いずれかが入る型である
• optionalと違って、エラーとなった理由を保持できる
• 従来のif(false) -> return -> if(false) -> returnのような流れを、
map/bindの高級インタフェースを使用することで、綺麗に書ける
• GitHubの参照実装を使用したり、boost::variantをラップして

自分で作ってみたりして、試してみてください。

Weitere ähnliche Inhalte

Was ist angesagt?

競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#Fujio Kojima
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編道化師 堂華
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
 

Was ist angesagt? (20)

競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
メタプログラミング C#
メタプログラミング C#メタプログラミング C#
メタプログラミング C#
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
Map
MapMap
Map
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 

Andere mochten auch

クソザコ鳥頭が非順序連想コンテナに入門してみた
クソザコ鳥頭が非順序連想コンテナに入門してみたクソザコ鳥頭が非順序連想コンテナに入門してみた
クソザコ鳥頭が非順序連想コンテナに入門してみたMitsuru Kariya
 
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++cocodrips
 
SDL2の紹介
SDL2の紹介SDL2の紹介
SDL2の紹介nyaocat
 
Boost.Graph入門
Boost.Graph入門Boost.Graph入門
Boost.Graph入門egtra
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorAkira Takahashi
 
Xとかオワコン?
Xとかオワコン?Xとかオワコン?
Xとかオワコン?Naohiro Aota
 

Andere mochten auch (14)

クソザコ鳥頭が非順序連想コンテナに入門してみた
クソザコ鳥頭が非順序連想コンテナに入門してみたクソザコ鳥頭が非順序連想コンテナに入門してみた
クソザコ鳥頭が非順序連想コンテナに入門してみた
 
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++
 
SDL2の紹介
SDL2の紹介SDL2の紹介
SDL2の紹介
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost.Graph入門
Boost.Graph入門Boost.Graph入門
Boost.Graph入門
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Xとかオワコン?
Xとかオワコン?Xとかオワコン?
Xとかオワコン?
 

Ähnlich wie error handling using expected

GC in C++0x
GC in C++0xGC in C++0x
GC in C++0xyak1ex
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境Yo Ya
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんYukari Sakurai
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
Rtm講習会 140626 02
Rtm講習会 140626 02Rtm講習会 140626 02
Rtm講習会 140626 02openrtm
 
ポインタ渡しと参照渡し
ポインタ渡しと参照渡しポインタ渡しと参照渡し
ポインタ渡しと参照渡しcocodrips
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwiftYuichi Adachi
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方Chihiro Ito
 

Ähnlich wie error handling using expected (20)

GC in C++0x
GC in C++0xGC in C++0x
GC in C++0x
 
秀スクリプトの話
秀スクリプトの話秀スクリプトの話
秀スクリプトの話
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Rtm講習会 140626 02
Rtm講習会 140626 02Rtm講習会 140626 02
Rtm講習会 140626 02
 
ポインタ渡しと参照渡し
ポインタ渡しと参照渡しポインタ渡しと参照渡し
ポインタ渡しと参照渡し
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwift
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
ji-2. 計算
ji-2. 計算ji-2. 計算
ji-2. 計算
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
 

Mehr von Akira Takahashi

Mehr von Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 
Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 
C++14 variable templates
C++14 variable templatesC++14 variable templates
C++14 variable templates
 
C++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexprC++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
 
C++14 binary literals
C++14 binary literalsC++14 binary literals
C++14 binary literals
 
Leaning random using Boost Random
Leaning random using Boost RandomLeaning random using Boost Random
Leaning random using Boost Random
 
Development C++ Community
Development C++ CommunityDevelopment C++ Community
Development C++ Community
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Boost Tour 1.53.0
Boost Tour 1.53.0Boost Tour 1.53.0
Boost Tour 1.53.0
 
Boost Tour 1.53.0 merge
Boost Tour 1.53.0 mergeBoost Tour 1.53.0 merge
Boost Tour 1.53.0 merge
 

error handling using expected