SlideShare a Scribd company logo
Modern C++ Programming
and
New C++ International
Standard (C++11)
ES松浦
twitter:@matu_ani
1
2011年11月30日水曜日
自己紹介?
『ストラウストラップのプログラミング入門』
•やっとでました!!
•2011年 8月 発売
•怒涛の1200ページ!
•通称:鈍器w
•8,190円 たけーっ!
いや、いち監修メンバーでしかないんですが...
つれー、3回通しで読んだからつれー。最後の2ヶ月で2回読んだもんな、つれー。原著もなー

2
2011年11月30日水曜日
Agenda
•今こそC++の魅力をお伝えしたい。
• 改めてC++の紹介をして、
• C++がサポートするプログラミングパラダイ
ムについて、少しkwsk

• boostや新しい国際標準(通称C++11)につ
いて軽く紹介
3
2011年11月30日水曜日
Content
• 歴史
• C++の使われどころ
• プログラミング・パラダイム
• boost おさわりだけ
• C++11ソフトタッチだけ
4
2011年11月30日水曜日
歴史
history

5
2011年11月30日水曜日
6
2011年11月30日水曜日
Common History
•
•

1979:C with Classes

•
•
•

1998:初の国際標準規格(C++98)

1990:『The Annotated C++ Reference Manual
(ARM)』
2003:マイナーバージョンアップ(C++03)
2011:初のメジャーバージョンアップ(C++11)

7
2011年11月30日水曜日
Common History
•
•

1979:C with Classes

•
•
•

1998:初の国際標準規格(C++98)

1990:『The Annotated C++ Reference Manual
(ARM)』
2003:マイナーバージョンアップ(C++03)
2011:初のメジャーバージョンアップ(C++11)

C++98以降、boostという拡張ライブラリ
開発を通してC++は成長していた。
そして、C++11にて別言語?というくらい
の大胆な進化を遂げた。
7
2011年11月30日水曜日
C++の使われど
ころ
What is Product that is
using C++
8
2011年11月30日水曜日
The Programming
Languages Beacon
• http://www.lextrait.com/vincent/
implementations.html

9
2011年11月30日水曜日
The Programming
Languages Beacon
• http://www.lextrait.com/vincent/
implementations.html
OS/ブラウザ/GUI/オフィス/DBMS/コンパイ
ラ/Game/JavaVM/Webプラットフォーム/
などなど、主要なソフトウェアプロダクトはC+
+で書かれている。

9
2011年11月30日水曜日
Why C++ is not
popular?
•
•

『C++はなぜ人気がないのか』

•

http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/
20050215/156201/

「日本でC++の評価が低いのは,こうしたソフトの大部分
が海外製であることの裏返しではないか,とまで思える」

10
2011年11月30日水曜日
Why C++ is not
popular?
•
•

『C++はなぜ人気がないのか』

•

http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/
20050215/156201/

「日本でC++の評価が低いのは,こうしたソフトの大部分
が海外製であることの裏返しではないか,とまで思える」

• 個人的には逆に、
• 「C++大好きなヤツが少ないから、こうした
(大切な)ソフトの大部分が海外製」なんじゃ
ね?とか思いますです、ハイ。
10
2011年11月30日水曜日
C++ is むずい??
その全てをマスターしようとすると
一人の人間の限界を軽く超えるw(私感)
しかしながら、

C++が備える言語機能、プログラミングパラダ
イム、イディオムにより、安全で効率のよいプロ
グラムを簡単に記述することが可能。
→ VBやSQLのような書き方が可能(EDSLとか言います)
→ ただし、ライブラリアンには高度なスキルが要求される
→ だからこそ?Geek達を惹きつけてやまない
11
2011年11月30日水曜日
プログラミング・
パラダイム
Programming Paradigm

12
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

13
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

手続き型

13
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

手続き型
オブジェクト指向

13
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

手続き型
オブジェクト指向
ジェネリック

13
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

手続き型
オブジェクト指向
ジェネリック
メタプログラミング
13
2011年11月30日水曜日
C++ has Multi
Programming Paradigm

手続き型
オブジェクト指向
ジェネリック
メタプログラミング
関数型
13
2011年11月30日水曜日
復習:ジェネリック
C#やJavaも備えている機能ですが、、、??
List<T> lst ;
ジェネリックは、単なる Parameterized
Type による汎用データ構造だけを指すわけ
ではない。

14
2011年11月30日水曜日
復習:ジェネリック
C#やJavaも備えている機能ですが、、、??
List<T> lst ;
ジェネリックは、単なる Parameterized
Type による汎用データ構造だけを指すわけ
ではない。

真の意味はデータと処理の分離
である
14
2011年11月30日水曜日
復習:オブジェクト指向
オブジェクト命! で、オブジェクトって
なんだっけ?

• データと処理(操作)が一緒になったもの
• データが主役で処理はそれに付随するもの
• モノとその振る舞い:オブジェクト

15
2011年11月30日水曜日
復習:オブジェクト指向
オブジェクト命! で、オブジェクトって
なんだっけ?

• データと処理(操作)が一緒になったもの
• データが主役で処理はそれに付随するもの
• モノとその振る舞い:オブジェクト
ソフトウェアではそれが常に真だろうか?
つーか、現実世界でどーなの?
15
2011年11月30日水曜日
例:探す
template<typename Iterator, typename Tp>
Iterator find(Iterator first, Iterator last, const Tp& val)
{
while (first != last && !(*first == val)) ++first;
return first;
}

•
•
•
•

探す条件例 : a == b
要素をたどる: ++a
要素を参照する: *a;
上記さえ満たせばあらゆる型に適用可能

16
2011年11月30日水曜日
例:探す
template<typename Iterator, typename Tp>
Iterator find(Iterator first, Iterator last, const Tp& val)
{
while (first != last && !(*first == val)) ++first;
return first;
}

•
•
•
•

探す条件例 : a == b
要素をたどる: ++a
要素を参照する: *a;
上記さえ満たせばあらゆる型に適用可能

「探す」とは、ある条件に合致する要素を
見つけること。それはデータ型には依存し
ない。# 「探す」の場合、データ構造には依存する事に注意
16
2011年11月30日水曜日
いろいろ探す
// svから"X"を探す
vector<string> sv;
・・・
vector<string>::iterator i = find(sv.begin(), sv.end(), "X");
// arから5を探す
int ar[10];
・・・
int* pi = find( ar, ar+10, 5);

17
2011年11月30日水曜日
いろいろ探す
// svから"X"を探す
vector<string> sv;
・・・
vector<string>::iterator i = find(sv.begin(), sv.end(), "X");
// arから5を探す
int ar[10];
・・・
int* pi = find( ar, ar+10, 5);

17
2011年11月30日水曜日
いろいろ探す
// svから"X"を探す
vector<string> sv;
・・・
vector<string>::iterator i = find(sv.begin(), sv.end(), "X");
// arから5を探す
int ar[10];
・・・
int* pi = find( ar, ar+10, 5);

17
2011年11月30日水曜日
いろいろ探す
// svから"X"を探す
vector<string> sv;
・・・
vector<string>::iterator i = find(sv.begin(), sv.end(), "X");
// arから5を探す
int ar[10];
・・・
int* pi = find( ar, ar+10, 5);

findは一回だけ書けば使い回し可能
「探す」は、データ型が変わっても不変である。
17
2011年11月30日水曜日
Generic Programing

• それはC++98のSTLで示された。
• オブジェクト指向に対するアンチテーゼ
•
•

オブジェクト指向は少なくとも銀の弾ではない
事実、現代のプログラミングモデルは継承を積極的に
は採用しない。むしろダック・タイピングを重視する
方向にある。

• 使いたいアルゴリズムを決めよ。様々な
型、データ構造を操作対象にできるよう、
それらをパラメータ化せよ。

•

Bjame Stroustrup
18

2011年11月30日水曜日
その他のパラダイム
• メタプログラミング
•

プログラム内にプログラムを生成する(言語内言
語)。これは闇の世界に突入するので次の機会に
でも

• 関数型
•

並列プログラミングの発展と共に非常に重要なパ
ラダイムとなった。 関数型自体は池田くんのプ
レゼン参照。C++はラムダやfunction型でそれ
をサポートする。今日はあとで、チョットだけ。

19
2011年11月30日水曜日
boost
C++98以降の、C++の進化

20
2011年11月30日水曜日
boost
•

C++の先駆的な開発者のコミュニティ、及びそのコ
ミュニティによって公開されているオープンソース
ライブラリのことを指す。コミュニティとしての
BoostはC++標準化委員会の委員により設立されて
おり、現在でもその多くが構成員として留まってい
る。このような経緯もあってBoostコミュニティは
C++の標準化に対してかなりの影響力を有してい
る。実際に標準化委員会の発表した「TR1」の
2/3以上がBoostライブラリを基にしている。

•

Boostはテンプレートなどを活用して積極的にメタ
プログラミングやジェネリックプログラミングを取
り入れていこうという傾向がある。

21
2011年11月30日水曜日
matzのC++紹介
• 「Boost C++ ライブラリは古典的な C+
+ 観からは想像もできないような総称型
プログラミングの世界を見せてくれてい
ます。」

• 「オブジェクト指向機能もある総称型プ

ログラミング言語。これがこれからの C
++ の立ち位置になるのかもしれません」

•

http://jp.rubyist.net/magazine/?0018-Legwork

22
2011年11月30日水曜日
一枚でboost (笑)
•
•
•
•
•
•
•

メモリ管理

•

scoped_ptr, scoped_array, shared_ptr, shared_array, weak_ptr

入出力

•

asio, filesystem, iostreams, serialization

小道具

•

foreach, scoped_exit,

関数型:

•

function, lambda, signals2

文字列系:

•

format, regex, tokenizer

並列・並行

•

interprocess, thread

他に、数学、メタプログラミング、などなど、膨大なライブラリです

•

https://sites.google.com/site/boostjp/

23
2011年11月30日水曜日
C++11
2011年、新国際標準

24
2011年11月30日水曜日
C++11
• ISO/IEC 14882:2011 は、2011年時
点で最新のプログラミング言語C++の
ISO標準である。省略して C++11 と呼
ばれる。規格の策定中は2009年中の標
準化を目指していたため、C++0xとい
う仮称で呼ばれていた。

• ISO/IEC 14882:2003 (C++03) に代
わるものとして、2011年8月12日に
ISOによって承認された。
25
2011年11月30日水曜日
抜粋
•
•
•
•
•
•
•
•
•
•
•
•
•

右辺値参照、Moveセマンティクス
Range-base for
lambda
型推論
nullptr
decltype
char16_t, char_32_t, raw string literal
constexpr
可変引数テンプレート
メンバー初期化子
initializer_list
ガベージコレクションと到達可能性ベースリーク検知の最小支援
スマートポインタ、thread、時間、などboostからたくさん

26
2011年11月30日水曜日
nullptr
これまで、NULLマクロ、0リテラル等でヌルポインタを
表現していた。しかし、NULLマクロと0リテラルは、テ
ンプレートで使用するとint型に推論されてしまうという
問題ががが。→ nullリテラル導入されますた。

int* p = nullptr;

27
2011年11月30日水曜日
右辺値参照、Moveセマ
ンティクス
• 個人的にはC++11最大のトピック
• ポインタ、参照に次ぐ、第三の文法、
&& アンパサを二個

struct X{
X(std::vector<int>&& v){...}
};

28
2011年11月30日水曜日
右辺値参照、Moveセマ
ンティクス
• 個人的にはC++11最大のトピック
• ポインタ、参照に次ぐ、第三の文法、
&& アンパサを二個

struct X{
X(std::vector<int>&& v){...}
};

説明すると何時間もかかるから
このへんでやめとく(笑)
28
2011年11月30日水曜日
Range-base for
// コンテナ
vector<int> v={1,2,3};
for(int value : v) {cout << value << endl;}
// 1
// 2
// 3
// 配列にも
int ar[]={1,2,3};
for(int value : ar) {cout << value << endl;}
// 1
// 2
// 3
29
2011年11月30日水曜日
型推論
かなりうざかっった
vector<int> v;
vector<int>::iterator it = v.begin();

これからは
vector<int> v;
auto it = begin(v); // v.begin(); と同じ

•従来のauto は廃止された。
•動的言語の要求の多くは型推論で解決す
る。# と言われている
30
2011年11月30日水曜日
lambda
vector<int> v;
find_if(v.begin(), v.end(),
[](int x) -> bool { return x % 2 == 0; });

•ラムダの外の変数を参照可能
•コピーでもリファレンスでも
•クロージャも書ける
31
2011年11月30日水曜日
ラムダと関数型
// 関数型を明示
function<int(int,int)> mul = [](int x,int y)->int{return x*y;};
mul(3,3) // 9
// 戻り値省略:これと同じ解釈
// auto add = [](int x, int y) ->decltype(x+y){return x+y;};
auto add = [](int x, int y){return x+y;};
add(3,3) // 6
// キャプチャとクロージャ
int v = 100
auto add2 = [=](int x){return v+y;};
add2(3) // 103

最小のラムダ式

auto f = [](){};
32

2011年11月30日水曜日
関数型ふう遅延評価
double div( int x, function<int()>& f){
if(x== 0) return NaN;
return f()/x; // この時点ではじめてfが評価される
}
int x = ...
auto result = div( x,
[](){ int ret; /*重い処理*/ return ret; } );

33
2011年11月30日水曜日
Smart Pointer
{

shared_ptr<A> x(new A);
x->func(); // ポインタと同じように使える
shared_ptr<A> y = x; // 代入(所有権)

} // スコープから抜けると自動でdelete

// make_sharedというヘルパ
shared_ptr<A> x = make_shared<A>();
// make_sharedなら型推論も
auto x = make_shared<A>();

scoped_ptr、week_ptrとかもあり。
auto_ptrはdeprecatedです。unique_ptr使ってね。
34
2011年11月30日水曜日
まとめ
• C++は世の中を支えている。(個人的
に一番面白いドメイン)
• boostは基本使う。つか、使え
• C++11は主要ベンダーがサポートし始
めたけど、実用レベルは?
• 組み込みもC++普通(話してない)
• 並列プログラミングも大事(話してな
い)
35
2011年11月30日水曜日
おつかれさま!!

36
2011年11月30日水曜日

More Related Content

PDF
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
PDF
2016tf study5
PDF
Development and Experiment of Deep Learning with Caffe and maf
PDF
TensorFlowで遊んでみよう!
PPTX
Go 言語を語ってみるか
PDF
エクストリームC++11/14プログラミング
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
C++ Template Metaprogramming
20180824 DLLab推論ナイト_深層学習モデル推論ライブラリ「Menoh」の紹介/Python以外でDeepLearning
2016tf study5
Development and Experiment of Deep Learning with Caffe and maf
TensorFlowで遊んでみよう!
Go 言語を語ってみるか
エクストリームC++11/14プログラミング
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Metaprogramming

Viewers also liked (20)

PDF
Boostのあるプログラミング生活
PDF
ABC2015 Summer LT
PDF
Boost study meeting opening 4
PDF
CG基礎3 メタリンク
PDF
boost::shared_ptr tutorial
PPTX
boost - std - C#
PDF
The Earth is not flat; but it's not round either (Geography on Boost.Geometry)
PDF
Template Meta Programming入門から応用まで
DOCX
Boost勉強会 #10 ディスカッションまとめ
PDF
Glfw3,OpenGL,GUI
PPTX
ゲーム開発経営ゲーム
PDF
3DCAD@VDI活用とCADデータ管理のロードマップ
PDF
Boost container feature
PDF
Boost Tour 1_58_0 merge
PDF
Boost tour 1.60.0
PPTX
3D CADと3Dプリンタ体験セミナー #1
PPTX
Unity MeshとColliderについて
PPTX
Boost apps ver1.0
PDF
ゲームアプリの数学@GREE GameDevelopers' Meetup
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
Boostのあるプログラミング生活
ABC2015 Summer LT
Boost study meeting opening 4
CG基礎3 メタリンク
boost::shared_ptr tutorial
boost - std - C#
The Earth is not flat; but it's not round either (Geography on Boost.Geometry)
Template Meta Programming入門から応用まで
Boost勉強会 #10 ディスカッションまとめ
Glfw3,OpenGL,GUI
ゲーム開発経営ゲーム
3DCAD@VDI活用とCADデータ管理のロードマップ
Boost container feature
Boost Tour 1_58_0 merge
Boost tour 1.60.0
3D CADと3Dプリンタ体験セミナー #1
Unity MeshとColliderについて
Boost apps ver1.0
ゲームアプリの数学@GREE GameDevelopers' Meetup
BoostAsioで可読性を求めるのは間違っているだろうか
Ad

Similar to boost and c++11 (20)

PPTX
Python による 「スクレイピング & 自然言語処理」入門
PDF
Python勉強会 2015-12-02
PDF
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
PDF
めもおきば新刊のお知らせ サーバーレスでHelloWorldする25の方法 #ssmjp
PPTX
M5StickVで詰まった話
PDF
アルゴリズムを楽しく!@PiyogrammerConference
PDF
Rubyの御先祖CLUのお話(原本)
PDF
C++ template-primer
PDF
Runtime c++editing
PDF
(超初心者向け)オブジェクト指向とC#
PPTX
Why python
PDF
Bjarne dont speaking
PDF
Introduction to Chainer (LL Ring Recursive)
PDF
clu2cの動態保存とはなんでしょう?(東海道らぐ 初オフ会 in オープンソースカンファレンス 2012 Kansai@Kyoto 資料)
PDF
スタートアップツールチラ見せ
PDF
人それぞれの競プロとの向き合い方
PDF
Pythonで自動化した話1
PPTX
ChainerでDeep Learningを試すために必要なこと
PDF
IT業界における伝統芸能の継承 #hachiojipm
PPTX
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~
Python による 「スクレイピング & 自然言語処理」入門
Python勉強会 2015-12-02
Tokyo.R女子部発表スライド「Rではじめるデータ解析の超基礎」
めもおきば新刊のお知らせ サーバーレスでHelloWorldする25の方法 #ssmjp
M5StickVで詰まった話
アルゴリズムを楽しく!@PiyogrammerConference
Rubyの御先祖CLUのお話(原本)
C++ template-primer
Runtime c++editing
(超初心者向け)オブジェクト指向とC#
Why python
Bjarne dont speaking
Introduction to Chainer (LL Ring Recursive)
clu2cの動態保存とはなんでしょう?(東海道らぐ 初オフ会 in オープンソースカンファレンス 2012 Kansai@Kyoto 資料)
スタートアップツールチラ見せ
人それぞれの競プロとの向き合い方
Pythonで自動化した話1
ChainerでDeep Learningを試すために必要なこと
IT業界における伝統芸能の継承 #hachiojipm
ChatGPT(LLMによる生成系AI)の追加学習を No Code で行う ~ 概念モデリング教本を元に ~
Ad

boost and c++11