boost – std - C# 
株式会社Codeer 
石川達也 
http://www.codeer.co.jp/
自己紹介 
石川達也 
株式会社Codeer代表取締役 
Microsoft MVP for C# 
C++は嗜む程度
1999 
2000 
2001 
2002 
2003 
2004 
2005 
2006 
2007 
2008 
2009 
2010 
2011 
2012 
2013 
2014 
3 
プログラム経験はこんな感じです。 
C++ 
C 
Java 
C# 
入社 
会社辞める→フリー 
Codeer設立
4 
1999 Boost - 1999/12/30(Early releasesが14日にあった) 
2000 
2001 
2002 Let’s Boostスタート 
2003 
2004 Boost本 
2005 
2006 
2007 
2008 
2009 
2010 
2011 C++11 
2012 
2013 
2014
5 
1999 Boost - 1999/12/30(Early releasesが14日にあった) 
2000 C#発表(6月) 
2001 
2002 Let’s Boostスタート 
2003 C#1.1 
2004 Boost本 
2005 C#2.0(11月) 
2006 
2007 
2008 
2009 
2010 
2011 C++11 
2012 
2013 
2014
6 
あれは2005年の春 
すっかりJavaにかぶれていたころ・・・ 
久しぶりにC++の仕事に就くことになりました。 
Javaサイコー
7 
なんじゃこりゃー! 
めっちゃメモリリークしとるやんけ! 
こんな複雑なコードでnew delete 
やったら、そらリークするわな・・・。 
大規模アプリ開発は 
GCなしではやってられまへん
8 
Boostとの遭遇–shared_ptr- 
shared_ptrというのがあってだね 
え、メモリ管理しなくていいの?
9 
Boostとの遭遇–shared_ptr- 
説明不要! 
みんな大好きshared_ptr! 
保持者がいなくなったら、破棄してくれる。 
GCより厳密なタイミングで破棄! 
もちろんC++11で標準に入っています。
10 
Boostとの遭遇–shared_ptr- 
みんな大好きshared_ptr! 
デリータを覚えているからdllの壁を越えられる 
Shared_ptr 
Heap Heap
11 
Boostとの遭遇–shared_ptr- 
標準に入れなかった子もいました。 
shared_array 
//これダメデストラクタが呼ばれない 
boost::shared_ptr<A> a(new A[3]); 
//delete[]が呼ばれる 
boost::shared_array<A> a(new A[3]);
12 
Boostとの遭遇–shared_ptr- 
標準に入れなかった子もいました。 
shared_array 
//こう書くんだってさ 
std::shared_ptr<A> a( 
new A[3], 
std::default_delete<A[]>());
13 
Boostとの遭遇 
他にもいくつか使ったけど、 
やっぱりshared_ptrが 
ダントツの使用率でした。
14 
時は流れ・・・・ 
すっかりC++できる気になってたころ・・・ 
テンプレートライブラリつくったぜー。 
↑読み返す気が起きない 
やっぱpimplだよねー。 
↑変な書き方で読みづらい 
ネイティブ以外ありえないよねー。 
↑根拠なし
15 
C#に出会いました! 
え、中間言語になるの? 
そんな軟弱なものやる気がおきんなー。 
2007年の暑い夏の日・・・
16 
C#に出会いました! 
なんじゃこりゃー 
書きやすい 
意外に速い 
C#サイコー! 
でも、Genericは・・・ 
2.0だったけど
17 
C#に出会いました! 
あれ、だったら同じ.Net使える 
C++/CLIとかもっと良いんじゃね?
18 
C#に出会いました! 
・・・・ 
やっぱC#サイコー
19 
C#に出会いました! 
foreach 
object型 
delegate 
これC++でも使えたらいいのにね
20 
これC++でも使えたらいいのにね 
foreach 
object型 
delegate
21 
foreach 
BOOST_FOREACH 
std::vector<A> vec; 
BOOST_FOREACH(A e, vec) {} 
まさかのマクロで実装!
22 
foreach 
BOOST_FOREACH 
std::vector<A> vec; 
BOOST_FOREACH(A e, vec) {} 
//参照もOK 
BOOST_FOREACH(A& e, vec) {} 
BOOST_FOREACH(const A& e, vec) {}
23 
foreach 
BOOST_FOREACH 
//これはコンパイル通らない 
std::map<int, int> m; 
BOOST_FOREACH( 
std::map<int, int>::value_type e, m) 
{ 
} 
マクロだから,に弱い
24 
foreach 
BOOST_FOREACH 
//これならOK 
typedef std::map<int, int> Map; 
Map m; 
BOOST_FOREACH( 
Map::value_type e, m) 
{ 
}
25 
foreach 
C++11では 
std::vector<A> vec; 
for(auto e : vec) {} 
//参照もOK 
for(const auto e : vec) {} 
for(const auto& e : vec) {} 
11ではautoって書く方がオシャレ
26 
foreach 
MS方言for each 
for each(A a in vec){} 
C++11以前でも使えてた!
27 
foreach 
MS方言for each 
for each(A a in vec){} 
//const 参照もOK 
for each(const A& a in vec){}
28 
foreach 
MS方言for each 
for each(A a in vec){} 
//const 参照もOK 
for each(const A& a in vec){} 
//参照はコンパイル通らない・・・(´・ω・`) 
for each(A& a in vec){}
29 
役に立つMS方言講座 
interface 
//classの代わりにinterfaceって書ける! 
interface IA 
{ 
public: 
virtual ~IA(){} 
virtual void Func() = 0; 
}; 
interfaceであることを強調・・・
30 
役に立つMS方言講座 
propertyが使える 
class A 
{ 
int b; 
public: 
int GetB() const { return b; } 
void SetB(int val) { b = val; } 
public: 
__declspec(property( 
get = GetB, put = SetB)) int B; 
};
31 
役に立つMS方言講座 
propertyが使える 
#define PROPERTY( _t, _m )  
private: _t m_##_m ;  
public:  
__declspec(property(get=get##_m, put=set##_m)) _t _m ;  
_t get##_m() { return m_##_m; }  
void set##_m( _t value ) { m_##_m = value; }; 
マクロを作ると書きやすい 
↓のサイトに書いてたよ 
http://www.moonmile.net/blog/archives/3557
32 
役に立つMS方言講座 
propertyが使える 
PROPERTY( int, Number ); 
class A 
{ 
PROPERTY( int, B); 
}; 
こんな感じ
33 
役に立つMS方言講座 
propertyが使える 
A a; 
a.B = 100; 
使う側では便利かも
34 
役に立つMS方言講座 
event 
struct A { 
__event void Func(); 
};
35 
役に立つMS方言講座 
event 
struct B { 
A* pA; 
void Func(){} 
B(A& a) : pA(&a) { 
__hook(&A::Func, pA, &B::Func, this); 
} 
~B() { 
__unhook(&A::Func, pA, &B::Func, this); 
} 
};
36 
これC++でも使えたらいいのにね 
foreach 
object型 
delegate
37 
object型 
boost::any 
//何でも入るよー 
int i = 0; 
long l = 1; 
boost::any a = i; 
a = l;
38 
object型 
boost::any 
//型情報も取れちゃう 
if (a.type() == typeid(long)) { 
} 
else if (a.type() == typeid(int)) { 
}
39 
object型 
boost::any 
//キャストで中身取得 
l = boost::any_cast<long>(a); 
//失敗したら例外 
try { 
i = boost::any_cast<int>(a); 
} 
catch (boost::bad_any_cast e){}
40 
object型 
boost::any 
//shared_ptrと合わせたらもっとポイよねー 
boost::any a = 
std::make_shared<X>(); 
便利だけど、標準化はされてないよね?
41 
object型 
boost::any 
型をボンヤリさせるテクニックは 
Type Erasureって言うんだって 
boost::shared_ptrとか 
boost::function 
にも使われているらしい。
42 
これC++でも使えたらいいのにね 
foreach 
object型 
delegate
43 
delegate 
class Test { 
int x = 0; 
public void MyAction() { x = 10; } 
public void Main() { 
Action a = MyAction; 
a(); 
} 
} 
そもそも何が便利? C# 
単なる関数ポインタではなく 
インスタンスに結びついている
44 
delegate 
boost::bind 
class Test 
{ 
int x; 
void MyAction(){ x = 10; } 
public: 
void Main() { 
boost::function<void()> a = 
boost::bind(&Test::MyAction, this); 
a(); 
} 
};
45 
delegate 
C++11では標準の仲間入り! 
class Test 
{ 
int x; 
void MyAction(){ x = 10; } 
public: 
void Main() { 
std::function<void()> a = 
std::bind(&Test::MyAction, this); 
a(); 
} 
};
46 
delegate 
そもそも何が便利? C# 
int i = 0; 
Action a = ()=> 
{ 
i++; 
} 
a(); 
ササっと書ける 
ローカル変数取り込める 
Assert.AreEqual(i, 1);
47 
delegate 
boost::lambda 
using namespace boost::lambda; 
boost::function<int(int)> a = _1 + 3; 
int i = a(5); 
なんじゃこりゃ?
48 
delegate 
boost::lambda 
boost::lambda::placeholder1_type& 
_1 = free1; 
なんじゃこりゃ?
49 
delegate 
boost::lambda 
placeholder1_type 
BOOST_LAMBDA_BE(operator+ 
BOOST_LAMBDA_BE(operator- 
BOOST_LAMBDA_BE(operator* 
BOOST_LAMBDA_BE(operator/ 
・・・・ 
こいつがoperator hoge 
を山ほど実装しとるわけですな
50 
delegate 
boost::lambda 
boost::function<int(int)> a = 
//operator +が実行され、 
//関数オブジェクトが返るのでした。 
_1 + 3; 
つまり、引数ありで、一文のみ。
51 
delegate 
int i = 0; 
auto a = [&]() 
{ 
i++; 
}; 
a(); 
C++11 
C++11なら言語でサポートされている
52 
LINQ 
LINQも重要なんだけど、 
それを実現するための機能の方がもっと重要 
型推論だってLINQの戻り値の型書くの嫌 
ラムダサラッと処理作って渡せるのがいいのよ 
(ここが98のアルゴリズムの弱点) 
匿名型任意に抽出したデータを返せる 
拡張メソッドあたかも、そのコンテナのメソッドのように 
使える 
これらはLINQ以外でもヘビーに使われる
53 
LINQ 
C++11では? 
型推論auto 
ラムダ言語サポート 
匿名型・・・・ 
拡張メソッド・・・・
54 
匿名型 
void main() { 
var a = Decl (() => 
{ 
return new { x = 1, y = "hoge" }; 
}); 
var ret = a(); 
} 
//型推論を助けてやらんとあかんけど 
static Func<T> Decl<T>(Func<T> x) { 
return x; 
} 
そもそもC#では
55 
匿名型 
[]() { 
struct{ 
int a; 
} a; 
return a; 
}; 
C++ 
できるかと思ったら 
さすがに怒られたw
56 
C++で拡張メソッド 
そもそもC#では 
class A { 
public int a{get; set;} 
} 
static class Aextensions { 
public static void X(this A a) { 
a.a = 100; 
} 
} 
A a; 
a.X();
57 
C++で拡張メソッド 
実はC++でもその試みはある! 
でも、ちょっと広い心が必要・・・
58 
C++で拡張メソッド 
実はC++でもその試みはある! 
//結果から言うとこうなります。 
A a; 
a|X(); 
関数オブジェクトとoperator演算子で解決した。 
で、operator.はないから|を使うらしい。 
まあ、|じゃなくても、納得いくものならなんでも・・・
59 
C++で拡張メソッド 
a|X(); 
struct A { int a; }; 
struct XCore { //③ 
void operator()(A& a){ a.a = 100; } 
}; 
//② 
void operator | (A& a, XCore& b) { b(a); } 
//① 
XCore X() { return XCore(); } 
そこまでしてやりたいんかい!
60 
C++で拡張メソッド 
a|X(); 
struct A { int a; }; 
struct XCore { //③ 
void operator()(A& a){ a.a = 100; } 
}; 
//② 
void operator | (A& a, XCore& b) { b(a); } 
//① 
XCore X() { return XCore(); } 
そこまでしてやりたいんかい!
61 
C++で拡張メソッド 
でもおかげで、メソッドチェーンができます。 
vector<int> vec; 
auto ret = vec 
| filtered([](const int &e) {...}) 
| filtered([](const int &x) {...}) 
| transformed([](const int &x) {...}); 
こう見るとパイプっぽくてカッコいい!
62 
LINQ 
C++11では? 
型推論auto 
ラムダ言語サポート 
匿名型×あかんかった 
拡張メソッド○ 
まあまあイケル
63 
LINQ 
C++11では? 
・cpplinq 
・boost.RangeのOven拡張 
とかあるんだって 
↓ここに書いてありました 
http://d.hatena.ne.jp/wordi/20131116/p1
64 
ご清聴ありがとうございました!

boost - std - C#