More Related Content Similar to boost - std - C# Similar to boost - std - C# (20) More from Tatsuya Ishikawa More from Tatsuya Ishikawa (20) boost - std - C#1. boost – std - C#
株式会社Codeer
石川達也
http://www.codeer.co.jp/
3. 1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
3
プログラム経験はこんな感じです。
C++
C
Java
C#
入社
会社辞める→フリー
Codeer設立
4. 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. 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
22. 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. 23
foreach
BOOST_FOREACH
//これはコンパイル通らない
std::map<int, int> m;
BOOST_FOREACH(
std::map<int, int>::value_type e, m)
{
}
マクロだから,に弱い
25. 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って書く方がオシャレ
27. 27
foreach
MS方言for each
for each(A a in vec){}
//const 参照もOK
for each(const A& a in vec){}
28. 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. 29
役に立つMS方言講座
interface
//classの代わりにinterfaceって書ける!
interface IA
{
public:
virtual ~IA(){}
virtual void Func() = 0;
};
interfaceであることを強調・・・
30. 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. 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
35. 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);
}
};
38. 38
object型
boost::any
//型情報も取れちゃう
if (a.type() == typeid(long)) {
}
else if (a.type() == typeid(int)) {
}
39. 39
object型
boost::any
//キャストで中身取得
l = boost::any_cast<long>(a);
//失敗したら例外
try {
i = boost::any_cast<int>(a);
}
catch (boost::bad_any_cast e){}
40. 40
object型
boost::any
//shared_ptrと合わせたらもっとポイよねー
boost::any a =
std::make_shared<X>();
便利だけど、標準化はされてないよね?
41. 41
object型
boost::any
型をボンヤリさせるテクニックは
Type Erasureって言うんだって
boost::shared_ptrとか
boost::function
にも使われているらしい。
43. 43
delegate
class Test {
int x = 0;
public void MyAction() { x = 10; }
public void Main() {
Action a = MyAction;
a();
}
}
そもそも何が便利? C#
単なる関数ポインタではなく
インスタンスに結びついている
44. 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. 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. 46
delegate
そもそも何が便利? C#
int i = 0;
Action a = ()=>
{
i++;
}
a();
ササっと書ける
ローカル変数取り込める
Assert.AreEqual(i, 1);
49. 49
delegate
boost::lambda
placeholder1_type
BOOST_LAMBDA_BE(operator+
BOOST_LAMBDA_BE(operator-
BOOST_LAMBDA_BE(operator*
BOOST_LAMBDA_BE(operator/
・・・・
こいつがoperator hoge
を山ほど実装しとるわけですな
51. 51
delegate
int i = 0;
auto a = [&]()
{
i++;
};
a();
C++11
C++11なら言語でサポートされている
52. 52
LINQ
LINQも重要なんだけど、
それを実現するための機能の方がもっと重要
型推論だってLINQの戻り値の型書くの嫌
ラムダサラッと処理作って渡せるのがいいのよ
(ここが98のアルゴリズムの弱点)
匿名型任意に抽出したデータを返せる
拡張メソッドあたかも、そのコンテナのメソッドのように
使える
これらはLINQ以外でもヘビーに使われる
54. 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. 55
匿名型
[]() {
struct{
int a;
} a;
return a;
};
C++
できるかと思ったら
さすがに怒られたw
56. 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();
59. 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. 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. 61
C++で拡張メソッド
でもおかげで、メソッドチェーンができます。
vector<int> vec;
auto ret = vec
| filtered([](const int &e) {...})
| filtered([](const int &x) {...})
| transformed([](const int &x) {...});
こう見るとパイプっぽくてカッコいい!
63. 63
LINQ
C++11では?
・cpplinq
・boost.RangeのOven拡張
とかあるんだって
↓ここに書いてありました
http://d.hatena.ne.jp/wordi/20131116/p1