[解決済み] C++のデリゲートとは何ですか?
質問
C++におけるデリゲートの一般的な考え方は?それらは何であり、どのように使用され、何のために使用されるのでしょうか?
まずは「ブラックボックス」的に勉強したいのですが、こういうもののガッツリした情報も少しあれば嬉しいです。
これは、最も純粋でクリーンなC++ではありませんが、私が働いているコードベースには、これらが豊富にあることに気づきました。私は、それらを十分に理解し、それらを使用することができ、恐ろしいネストされたテンプレートのひどさを掘り下げなくて済むようにしたいと思っています。
この2つの コードプロジェクト の記事は、私が言いたいことを説明してくれていますが、特に簡潔ではありません。
解決方法は?
C++でデリゲートを実現するには、信じられないほどの数の選択肢があります。以下は、私の頭に浮かんだものです。
選択肢1:ファンクタ。
を実装することで、関数オブジェクトを作成することができます。
operator()
struct Functor
{
// Normal class/struct members
int operator()(double d) // Arbitrary return types and parameter list
{
return (int) d + 1;
}
};
// Use:
Functor f;
int i = f(3.14);
オプション 2: ラムダ式 ( C++11 のみ)
// Syntax is roughly: [capture](parameter list) -> return type {block}
// Some shortcuts exist
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);
オプション3:関数ポインタ
int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);
オプション4:メンバ関数へのポインタ (最速の解決策)
参照 高速C++デレゲート は コードプロジェクト ).
struct DelegateList
{
int f1(double d) { }
int f2(double d) { }
};
typedef int (DelegateList::* DelegateType)(double d);
DelegateType d = &DelegateList::f1;
DelegateList list;
int a = (list.*d)(3.14);
オプション5: std::関数
(または
boost::function
標準ライブラリがサポートしていない場合)。速度は遅いですが、最も柔軟性があります。
#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
// Usually more useful as a parameter to another functions
オプション 6: バインディング (使用 std::bind )
あらかじめパラメータを設定しておくことで、例えばメンバ関数を呼び出す際に便利です。
struct MyClass
{
int DoStuff(double d); // actually a DoStuff(MyClass* this, double d)
};
std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
// auto f = std::bind(...); in C++11
オプション7:テンプレート
引数リストと一致するものであれば、何でも受け入れる。
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】coutはstdのメンバではない
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] Objective-CとC++はどう違うのですか?[クローズド]