Suche senden
Hochladen
Objc lambda
•
Als KEY, PDF herunterladen
•
2 gefällt mir
•
2,077 views
M
matuura_core
Folgen
Business
Technologie
Melden
Teilen
Melden
Teilen
1 von 47
Jetzt herunterladen
Empfohlen
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
C++14 Overview
C++14 Overview
Akira Takahashi
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada
More C++11
More C++11
京大 マイコンクラブ
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Empfohlen
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
C++14 Overview
C++14 Overview
Akira Takahashi
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
Shintarou Okada
More C++11
More C++11
京大 マイコンクラブ
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
Map
Map
kikairoya
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
C++11
C++11
京大 マイコンクラブ
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
知って得するC#
知って得するC#
Shota Baba
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
SEH on mingw32
SEH on mingw32
kikairoya
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
C++入門?
C++入門?
tsudaa
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Chakkason.pptx
Chakkason.pptx
Kenji Imasaki
連邦の白いヤツ 「Objective-C」
連邦の白いヤツ 「Objective-C」
matuura_core
Weitere ähnliche Inhalte
Was ist angesagt?
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
Map
Map
kikairoya
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
信之 岩永
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
C++11
C++11
京大 マイコンクラブ
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
ShinichiAoyagi
知って得するC#
知って得するC#
Shota Baba
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
SEH on mingw32
SEH on mingw32
kikairoya
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
C++入門?
C++入門?
tsudaa
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Was ist angesagt?
(20)
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 8.0 null許容参照型
C# 8.0 null許容参照型
Map
Map
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
Emcjp item21
Emcjp item21
C++11
C++11
JavaScript 講習会 #1
JavaScript 講習会 #1
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
知って得するC#
知って得するC#
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
SEH on mingw32
SEH on mingw32
新しい並列for構文のご提案
新しい並列for構文のご提案
C++入門?
C++入門?
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
クロージャデザインパターン
クロージャデザインパターン
Andere mochten auch
Chakkason.pptx
Chakkason.pptx
Kenji Imasaki
連邦の白いヤツ 「Objective-C」
連邦の白いヤツ 「Objective-C」
matuura_core
SPL fukuokaphp_1
SPL fukuokaphp_1
ichikaway
Matuura cpp
Matuura cpp
matuura_core
Essence of the iterator pattern
Essence of the iterator pattern
Markus Klink
型! 型!
型! 型!
真一 北原
The Essence of the Iterator Pattern
The Essence of the Iterator Pattern
Eric Torreborre
Iterator Pattern
Iterator Pattern
melbournepatterns
Andere mochten auch
(8)
Chakkason.pptx
Chakkason.pptx
連邦の白いヤツ 「Objective-C」
連邦の白いヤツ 「Objective-C」
SPL fukuokaphp_1
SPL fukuokaphp_1
Matuura cpp
Matuura cpp
Essence of the iterator pattern
Essence of the iterator pattern
型! 型!
型! 型!
The Essence of the Iterator Pattern
The Essence of the Iterator Pattern
Iterator Pattern
Iterator Pattern
Ähnlich wie Objc lambda
JavaScript入門
JavaScript入門
Ryo Maruyama
Prosym2012
Prosym2012
MITSUNARI Shigeo
C++0x総復習
C++0x総復習
道化師 堂華
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
egtra
C++ lecture-0
C++ lecture-0
sunaemon
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Akira Takahashi
Objectie-C de ラムダ
Objectie-C de ラムダ
Akihiko Matuura
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
C#勉強会
C#勉強会
hakugakucafe
TypeScript と Visual Studio Code
TypeScript と Visual Studio Code
Akira Inoue
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
Koichi Sakata
SystemC Tutorial
SystemC Tutorial
kocha2012
VerilatorとSystemC
VerilatorとSystemC
Mr. Vengineer
Ähnlich wie Objc lambda
(20)
JavaScript入門
JavaScript入門
Prosym2012
Prosym2012
C++0x総復習
C++0x総復習
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
C++ lecture-0
C++ lecture-0
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Objectie-C de ラムダ
Objectie-C de ラムダ
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Clojure programming-chapter-2
Clojure programming-chapter-2
C++0x 言語の未来を語る
C++0x 言語の未来を語る
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
C#勉強会
C#勉強会
TypeScript と Visual Studio Code
TypeScript と Visual Studio Code
関ジャバ JavaOne Tokyo 2012報告会
関ジャバ JavaOne Tokyo 2012報告会
SystemC Tutorial
SystemC Tutorial
VerilatorとSystemC
VerilatorとSystemC
Kürzlich hochgeladen
シンフォニティ株式会社(SYMPHONITY , Inc.) 会社説明・人材採用資料
シンフォニティ株式会社(SYMPHONITY , Inc.) 会社説明・人材採用資料
シンフォニティ 株式会社
Service-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadership
Yasuyoshi Minehisa
20240427 zaim academy counseling lesson .pdf
20240427 zaim academy counseling lesson .pdf
ssuser80a51f
ストックマーク株式会社がご提供しているAnews(エーニュース)概要紹介.pdf
ストックマーク株式会社がご提供しているAnews(エーニュース)概要紹介.pdf
masakisaito12
202405_VISIONARYJAPAN_engineerteam_entrancebook(ver2.1)
202405_VISIONARYJAPAN_engineerteam_entrancebook(ver2.1)
KayaSuetake1
UP103シリーズ パワーコメット ユニパー スライドレールタイプ 瓦揚げ機 ウインチ
UP103シリーズ パワーコメット ユニパー スライドレールタイプ 瓦揚げ機 ウインチ
ユニパー株式会社
Kürzlich hochgeladen
(6)
シンフォニティ株式会社(SYMPHONITY , Inc.) 会社説明・人材採用資料
シンフォニティ株式会社(SYMPHONITY , Inc.) 会社説明・人材採用資料
Service-introduction-materials-misorae-leadership
Service-introduction-materials-misorae-leadership
20240427 zaim academy counseling lesson .pdf
20240427 zaim academy counseling lesson .pdf
ストックマーク株式会社がご提供しているAnews(エーニュース)概要紹介.pdf
ストックマーク株式会社がご提供しているAnews(エーニュース)概要紹介.pdf
202405_VISIONARYJAPAN_engineerteam_entrancebook(ver2.1)
202405_VISIONARYJAPAN_engineerteam_entrancebook(ver2.1)
UP103シリーズ パワーコメット ユニパー スライドレールタイプ 瓦揚げ機 ウインチ
UP103シリーズ パワーコメット ユニパー スライドレールタイプ 瓦揚げ機 ウインチ
Objc lambda
1.
Objective-C
de lambda 松浦 明彦 @matu_ani 1
2.
自己紹介 • コップ本読んでる途中な程度 • 札幌C++勉強会メンバー(最年長w)
• 「プログラミングの魔導少女」:巻末記事 • 監修メンバー • 「C++の設計と進化」(通称:D&E) • 「ストラウストラップのプログラミング入門」 (通称:鈍器w) • ジャズと酒が趣味、シングルパパです。 2
3.
お話しすること・ねらい • Objective-Cの紹介がてら、関数型つなが りでObjective-Cのラムダ式(Blocks)に
ついてお話します。 • めざせBlocks完全制覇!! • 実装・シンタックス寄り、現場的なお話し です。 • 関数型的なお話は殆どありません m(_ _)m 3
4.
もくじ • Objective-C 文法基礎 •
Objective-C Blocks基礎 • Objective-C Blocks応用 • C++とBlocks 4
5.
Objective-C 文法基礎
さらっと流します... 5
6.
Objective-Cとは • C言語にオブジェクト指向機能を追加:☓ • Smalltalk風
Object Systemの言語環境にて、C 言語も使うことが出来る:○ • Cの言語仕様自体には、何も足さない何も引かない。 6
7.
Objective-Cとは • C言語にオブジェクト指向機能を追加:☓ • Smalltalk風
Object Systemの言語環境にて、C 言語も使うことが出来る:○ • Cの言語仕様自体には、何も足さない何も引かない。 スクリプト言語並の動的言語と静的型付 け言語が共存するハイブリッドな環境 6
8.
Smalltalk 例 "initializeメッセージをaMyObjectに送信" aMyObject initialize. "引数30のsetSizeメッセージをaSquareに送信" aSquare
setSize : 30. "オブジェクト「3」にセレクタ「+」を引数「4」で送信" total := 3 + 4. 7
9.
Objective-Cでのメッ セージ送信 • メソッド呼び出しは、メッセージ(セ レクタ)送信の結果である。 //
単項メッセージ(引数なし) [receiver msg]; // receiver->msg(); // 引数付きメッセージ val = [receiver msg: arg1 with: arg2]; // val = receiver->msg( arg1, arg2 ); 8
10.
Objective-Cでのメッ セージ送信 • メソッド呼び出しは、メッセージ(セ レクタ)送信の結果である。 //
単項メッセージ(引数なし) [receiver msg]; // receiver->msg(); [] で囲う メッセージキーワード // 引数付きメッセージ val = [receiver msg: arg1 with: arg2]; // val = receiver->msg( arg1, arg2 ); 8
11.
クラスの宣言・定義 • クラスの宣言・定義には@コンパイラ ディレクティブを使う。 •
通常、宣言部を.hファイル、実装部を.m ファイルに記述する。(一緒でもよい) • #importは#includeと基本同じだが、二 重includeしない。 9
12.
#import <Foundation/Foundation.h> // クラスの宣言 @interface
MyClass : NSObject { int val; } - (id)init; + (void)classMethod:(id)arg; // クラスメソッド - (id)method:(NSObject*)arg1 with:(int)arg2; @end // 実装 @implementation MyClass + (void)classMethod:(id)arg { // some operation } - (id)method:(NSObject*)arg1 with:(int)args2 { return obj; } @end 10
13.
#import <Foundation/Foundation.h> // クラスの宣言 @interface
MyClass : NSObject { int val; } - (id)init; + (void)classMethod:(id)arg; // クラスメソッド - (id)method:(NSObject*)arg1 with:(int)arg2; @end // 実装 @implementation MyClass + (void)classMethod:(id)arg { // some operation } - (id)method:(NSObject*)arg1 with:(int)args2 { return obj; } @end 10
14.
制御構文 • if,while,for,とか、JavaやC++と同じ。
AlarmFake* f = [[AlarmFake alloc]init]; if( [f conformsToProtocol:@protocol(Alarm)] ) { // ・・・ } 11
15.
基礎編、もうちょい • C/C++との共存 • メモリ管理について
12
16.
C/C++との共存 • 普通にC/C++が使える。 • C++を使う場合、.mでなく、.mmにす
る。(ていうか基本.mmにすべし) • boostも使える。 • Xcode4.2のllvm-clangはC++11(一 部)も! 13
17.
#import <Foundation/Foundation.h> #include <iostream> #include
<boost/shared_ptr.hpp> class CppClass{ public: C++のクラス ! CppClass(){} ! void print() const { ! ! std::cout << "CppClass::print" << std::endl; ! } }; @interface ObjcClass : NSObject - (void)print; @end Objective-Cのクラス @implementation ObjcClass - (void)print { ! NSLog(@"ObjcClass print"); } @end void boost_test(){ ! boost::shared_ptr<CppClass> p(new CppClass);! ! ObjcClass* oc = [[ObjcClass alloc]init];! ! [oc print]; // ObjcClass print ! p->print(); // CppClass::print } 14
18.
メモリ管理 • Objective-Cのクラスは静的には生成で
きない。必ずallocする。 MyObject* obj = [[MyObject alloc] init]; [obj method :arg with:10]; 15
19.
参照カウンタ • 難敵:retain,release,autorelease MyObject*
obj = [[MyObject alloc] init]; // 参照カウント1 [obj retain]; // 参照カウント2 NSLog(@"count=%d", [obj retainCount] ); // count=2 [obj release] ; // 参照カウント1 [obj release] ; // 参照カウント0,開放される ・・・ // メモリプールが有効なあいだ生きてる MyObject* obj = [[[MyObject alloc] init] autorelease]; [obj retain]; // 参照カウント2、メモリプールの生き死に関わらず保持した い! 16
20.
簡単にリークするw • release忘れ • retainしすぎ •
autorelease忘れ • しかも、これらが絡み合うww • ..... Appleが示した解決策は 17
21.
Automatic Reference Counting (ARC) •
iOS5、MacOSX10.6から • Xcode4.2ではデフォルト • 参照カウンタ管理をコンパイル時に解決し てくれる。ヽ(^。^)ノ • retain/release/retainCount等は書かなく ていい。 • てか、書いたらコンパイルエラー orz • GCとは別(GCもオプションであり) 18
22.
その他の機能 •
ランタイムシステム • プロパティ • プロトコル • カテゴリ • クラスエクステンション • クラスクラスタ • 例外 • GC • 高速列挙 • ・・・などなど、あと、フレームワークには一切触れてません 19
23.
Objective-C Blocks
20
24.
Blocks基礎
21
25.
Blocksって • ようはラムダです。 •
ラムダ式のリテラル • MacOSX 10.6/iOS 4.0以降 • AppleのC言語の拡張 • http://www.open-std.org/jtc1/sc22/wg14/ www/docs/n1370.pdf 22
26.
Declaring a Block •
シンタックスはCの関数ポインタと似ている。 • ^ を使う。 23
27.
Using a Block void
(^b1)(int) = ^(int x){NSLog(@"Hello Blocks %d",x);}; b1(100); // Hello Blocks 100 // パラメータ無しなら定義側は()を省略してもOK void (^b2)() = ^{NSLog(@"Hello Blocks 2");}; b2(); // Hello Blocks 2 24
28.
パラメータにBlock void blocks_caller( void
(^f)(void) ) { ! f(); } void blocks_test() { ! blocks_caller( ^(){ NSLog(@"test1");} ); } 25
29.
Blocksどーよ • 最近のCocoaAPI は積極的にBlockを
使う傾向にある(iCloud APIとか)。 • なんだかんだメモリ管理を意識。 Automatic Reference Counting (ARC) のもとで使うのが良さそう。 • 過渡期っぽい.....が、今後は重要なプロ グラミングスタイルと思われ。 26
30.
Blocks応用
といっても、 キャプチャとかBlockの寿命とかそのへん 27
31.
変数のキャプチャ • ローカル変数、グローバル変数をBlock 内で使用可能 •
ローカル変数はデフォルトで、イミュー タブル、かつBlock構築時のコピー 28
32.
キャプチャの例 int g=999; //
グローバル変数 ・・・ int x = 100; void (^b)() = ^(){NSLog(@"x=%d g=%d",x,g);}; b(); // x=100 g=999 x=200; b(); // x=100(変わらず) g=888; b(); // x=100 g=888 29
33.
ミュータブルで共有なキャ プチャ __block int
x=100; void (^b)() = ^(){NSLog(@"x=%d g=%d", x++, g);}; b(); // x=100 g=999 b(); // x=101 g=999 x=200; b(); // x=200 g=999 30
34.
クラスで使う
@interface testClass : NSObject{ int x_; } -(void) myprint; -(void) print:(void(^)(int x))printer; @end @implementation testClass -(void)print:(void (^)(int x))printer { printer(x_); } testClass* t = [[testClass alloc]init]; [t print:^(int x){ NSLog(@"my printer x=%d", x);}]; 31
35.
selfのキャプチャ -(void)myprint { //
testClassのメソッド x_ = 100; void(^b)()=^{ NSLog(@"x_=%d", x_);}; b(); // x_ = 100 x_ = 200; b(); // x_ = 200 !!(コピーと違うの??) // こう書いているのと同じ void(^b2)()=^{ NSLog(@"testClass x_=%d", self->x_);}; } • メンバー変数がキャプチャされているのではない • selfがキャプチャされている! 32
36.
高階関数、部分適用 C# Func<int, Func<int, int>>
f = x => y => x + y; Func<int, int> fc = f(1); int x = fc(3); // 4 (1 + 3) C++11 auto f = [](int x){ return [x](int y){return x+y;}; }; auto fc = f(1); int x = fc(3); // 4 (1 + 3) 33
37.
Blockだと。。 void blocks_test() { ! typedef
int (^add_function)(int); ! add_function (^f)(int) = ! ! ! ! ! ^(int x){ ! ! ! ! ! ! return Block_copy(^(int y){ return x+y;}); ! ! ! ! ! }; ! add_function fc = f(1); ! NSLog(@"blocks_test() fc=%d", fc(3)); // 4 (1 + 3) ! Block_release(fc); } 34
38.
Blocks大事なこと • Blockの生存期間はそのスタックと同じ。 • スタック外で使うならコピーが必要。
• Block_copy / Block_release • ただ、コピーしなくてもコンパイル通る(事が多い)し、 動くから恐ろしい。 • ARCのもとでは Block_copy / Block_release 不要。 • てかコンパイルエラーになる 35
39.
ARCありなら... void blocks_test() { ! typedef
int (^add_function)(int); ! add_function (^f)(int) = ^(int x){return ^(int y){return x+y;};}; ! add_function fc = f(1); ! NSLog(@"blocks_test() fc=%d", fc(3)); // 4 (1 + 3) } すっきり(^^) 36
40.
軽くまとめ • ローカル変数のキャプチャはデフォルトで イミュータブルかつBlock構築時のコピー。 •
__block修飾されたローカル変数は、ミュー タブルとなり、そのスタック内のblockで共 有される。 • Blockの寿命はスタックと同じ。スタック外 でも使いたければcopyが必要。 • ARCが吉 37
41.
BlocksとC++ 実はここを一番話したかったという噂もw...
38
42.
C++11のfunction<T>
にBlockを std::function<void(int)> f = ^(int x){NSLog(@"Hello function!! x=%d",x);}; f(1); // Hello function!! x=1 f(2); // Hello function!! x=2 std::function<T>は、Blocks対応に書き換え てあるのかな?? 39
43.
簡易function作った template<typename R, typename
...V> struct my_function { struct HolderBase{ virtual R run(V... arg)=0; }; template<typename F> struct Holder : HolderBase { F f_; Holder(F f):f_(f){} virtual R run(V... arg) { return f_(arg...); } }; boost::scoped_ptr<HolderBase> holder_; template<typename F> my_function(F f) : holder_(new Holder<F>(f) ){} R operator()(V... arg) { holder_->run(arg...); } }; 40
44.
my_functionにも my_function<void,int> mf(^(int x){NSLog(@"my_function!!
x=%d",x);}); mf(100); // my_function!! x=100 • my_functionにBlocks固有のコードは無い。 • BlocksはObjC固有の型だが、C++のジェネリッ ク型システムはそれを吸収した(とも言えるか と)。 • 無論、std::functionは変更不要 (のはず) 。 41
45.
C++11 autoで型推論 // blockをautoで型推論 auto
af = ^(int x){NSLog(@"Hello C++11 auto!! x=%d",x);}; af(5); // Hello C++11 auto!! x=5 // 高階関数も楽チン auto f = ^(int x){ return ^(int y){ return x+y;};}; auto fc = f(1); NSLog(@"Hello C++11 auto!! fc=%d",fc(3)); // fc=4 42
46.
C++11 autoで型推論 // blockをautoで型推論 auto
af = ^(int x){NSLog(@"Hello C++11 auto!! x=%d",x);}; af(5); // Hello C++11 auto!! x=5 // 高階関数も楽チン auto f = ^(int x){ return ^(int y){ return x+y;};}; auto fc = f(1); NSLog(@"Hello C++11 auto!! fc=%d",fc(3)); // fc=4 やっぱC++かわいいw 42
47.
ご清聴 ありがとうございました
43
Hinweis der Redaktion
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Jetzt herunterladen