• ベストアンサー

C++でデリゲート

C#で仕事されている方から質問されたのですが、C++でデリゲートは利用できるのでしょうか? 私はC#を使ったことがなくC++の言語仕様も詳しくないので答えられませんでした。 ざっと話を聞いたところコールバックを手軽に利用できるという印象でした。 本質はC#を勉強してみようと思いますが、C++では利用できるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

○C++ にはデリゲートその物に対応する文法は存在しませんが、等価な機能を実現する方法は色々あります。 a. C++11 以降のラムダ式を用いればデリゲート(オブジェクトインスタンスに紐付いたメンバ関数)と同様の物を簡単に作成できます。 例: struct MyClass{ int instanceMemberFunction(int,int); } obj; auto func = [&obj](int _1,int _2) -> int{return obj.instanceMemberFunction(_1,_2);}; b. 或いは、C++11 以降で標準ライブラリに取り込まれた std::bind, std::placeholders 等を組み合わせるという事もできます。 例: // #include <functional> auto func = std::bind(std::mem_fun(&MyClass::instanceMemberFunction), &obj, std::placeholders::_1, std::placeholders::_2); c. C++03 以前でも、等価な事を実現する為のテンプレートを自分で書くことは勿論できます。 例えば、以下の様にして使える Function/CreateDelegate を作るのはそんなに難しくない(実際 Boost ライブラリの boost::function, boost::bind1st, boost::mem_fun あたりを拡張する様な感じでできるのでは)と思います。 Function<int(int,int)> func = CreateDelegate(&obj, &MyClass::instanceMemberFunction); 一旦この様なテンプレートを書いてしまえば、この方法が一番 C# に近い形で使えるのかなと思います。また、マルチキャストデリゲートの対応も、Function クラスの機能として自然に実装できます。 ○注意点 但し、C++ は C# と違ってガベージコレクションがないので、オブジェクトインスタンスの寿命に気を付けなければなりません。特にローカル変数として宣言したクラスインスタンスはスコープを抜けると(≒関数を抜けると)消えてなくなります。寿命の管理は、多くの場合 C++11 の std::shared_ptr で済ませられると思います(勿論、循環参照などには気をつける必要はあります)。 例: // #include <memory> std::shared_ptr<MyClass> pobj=std::make_shared<MyClass>(); auto func = [pobj](int _1,int _2) -> int{return pobj->instanceMemberFunction(_1,_2);}; 最後に: C# と比べると C++ でデリゲートの機能を利用するのは色々と面倒であり C# 使いから見れば C++ は劣っている様に思われるかもしれません。しかし、自分で色々と指定できる分、柔軟に設計できるのが C++ の強みです。効率的に開発するなら C# で、細部にこだわりたいのであれば C++ で、ということです…

TeijigoTeatime
質問者

お礼

早々のレスかつ詳細な説明をありがとうございます。 C++に標準であるのかな?と勘違いしていました。 ラムダ式もイマイチ分かっていないのでこれもマスターしようと思います。 見よう見まねで実装してみました。それっぽいものはできました。時間のあるときに煮詰めていきたいです。

その他の回答 (1)

回答No.1
TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 普通にC++に標準であるのかと勘違いしていました。 リンクはとても参考になります。

関連するQ&A

  • VB.NET デリゲートへのコールバック関数の設定

    VB.NET デリゲートへのコールバック関数の設定 VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。 ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに 登録するには、どのようにコーディングすればよいのでしょうか。 ---------- VB.NETソース ---------- Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer) Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00 Dim Func As new CALLBACK_00(FuncPtrGet()); 2行目は、実際にはVOID*が帰るDLL関数です。 3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

  • c# イベント用デリゲートの引数

     こんにちは。c#初心者です。  今回はイベントに用いるためのデリゲートの引数に関する質問です。  通常、「System.Windows.Forms.Control」のイベントで用いられているデリゲートの引数は全て  void SampleHandler(object sender, SampleEventArgs e)  のようになっていますが、コントロール以外のクラス(System.Windows.Forms.Controlから派生しないクラス)、例えばコレクションクラスのようなものでも同じように「EventHandler<T>」デリゲートを使わなければならないのでしょうか?  それともう一つ質問です。コントロールクラスでのイベントの引数は  SampleHandler(object sender, …  のようにせずに  SampleHandler(SampleControl sender, …   としてはいけないのでしょうか? (いけないと思いますが…)  質問は以上の2点です。どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • C/C++をはじめるためには

    C/C++言語の勉強をはじめようとしている者です。 始めようと考えたまではよかったのですが、どうしたら始める事ができるのか分からず、困っています。 私のプラントしてはC言語の勉強をしてからC++の勉強を始めようと思っています。 それはやはり、C言語を勉強してからの方がC++の勉強を進めやすいと考えるからです。(←コレは素人の考えかたでしょうか?) ネットで調べてみたりしたのですが、いきなり変数とはみたいなところから入っているのでよく分かりません。私はまず、C言語の勉強をするための環境を整えるところから知りたいのですが。 コンパイラというものを入れるだけで良いのでしょうか? また、エディタはメモ帳よりもサクラエディタやテラパッドのようなものを利用したほうが良いのでしょうか? 私は学生で本格的に開発しようとかというのではなく、C言語がある程度使えるようにするために勉強したいだけなのでお金はかけずにやりたいのですが可能でしょうか? C++についても上と同じことで悩んでいます。 最後に、勉強していく時に役に立つサイトなどがありましたら教えていただけませんか? よろしくお願いします。

  • イベントドリブン(C言語)

    イベントドリブン(C言語) こんにちわ、質問があります。 とあるイベントドリブン型のプログラムについて説明をされました。 ソフトはOS(元はハード)からManagerと言われる管理タスクにイベントが 飛んでいき、Managerから各タスクの関数がコールされる仕組みだそうでです。 また、それだけでなくOSから各タスクのコールバック(?)関数がコールされる事も あるそうです。 ◆質問 ここでいうイベントとは何なんでしょうか? 結局C言語なので、イベントと呼ばれているモノは関数コールなんでしょうか? C言語でイベントドリブン型プログラムを作成した事がある方、 自分ならこう作るぞという方、教えてください。

  • CとC#

    VB.NETで開発をしている新米プログラマです。 仕事とは関係なくC#の勉強を始めたところなんですが、仕事でC言語を覚えなければならない可能性が出てきました。 まだ決定かどうかハッキリしない状態なんですが、今のうちからC言語の勉強をしておいたほうがいいと思っています。 そこで、CとC#を平行して勉強するというのはあまり効率のよくないものでしょうか?

  • c# デリゲート関連の命名について

     こんにちは。c#初心者です。  今回はデリゲート関連の命名についての質問です。 // ――――――――――――――――――――――――――――――― // 簡素化のため、フィールド変数のまま書いています public delegate int SampleDelegate(); public SampleDelegate SampleAction; public int Value {   get { return SampleAction(); } } // ―――――――――――――――――――――――――――――――  上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。  SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、  SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。  最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。  どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

  • C言語のいわゆる「良書」を紹介してください

    仕事上C言語を勉強しております。 本屋に行っても書籍が多すぎてどれがいいのかよくわからないです。そこで皆さんのお勧めの「良書」と言われるC言語の本を紹介していただけないでしょうか? 私が欲しいのは「文法」の本と「プログラミング方法」の本の2つです。私のリクエストとしては 【文法】 ・文法があますところなく網羅されている ・話の展開が系統立てて、よくまとまって読みやすい ・K&R本よりも詳しい 【プログラミング方法】 ・メモリやキャッシュの効率的な利用法など、ハードの仕様も考慮に入れたプログラムの組み方について解説している。 ・面白くてトリッキーなアルゴリズムが紹介されている 以上、よろしくお願いします。

  • Visual C++でCのソリューションファイル(.c)を動かすには

    仕事で利用するためにC言語を勉強しようと思い、Visual C++ 2005を購入しました。知り合いから頂いた、過去にC言語(拡張子.c)で作られた複数のソリューションファイル等で構成されるプログラムをVisual C++ 2005で動かそうと思い、市販のVisual C++ 2005の参考書籍類で調べていますが、その具体的方法が分かりません。C言語に関してはまだ初心者なので、まだ十分に参考書籍を読みこなすことが出来ず、どなたか御教示頂ければ幸甚です。

  • visual C++6.0でC言語の勉強は出来る?

     卒業研究に際して先生から「C言語の勉強をしておいたほうがいい」とのことでしたのでC言語を学びたいと思っています。  そこで調べてみるとC言語には大別してCとC++があるようですが先生の言葉から「C」を勉強すればいいのですよね?(ここは今度確認しますが)  今、手元にはvisual C++6.0というソフトがありますが(ライセンス等はOK)、ソフト名から察するにC++しか出来ないのでしょうか?Cを動かすことは可能でしょうか?  また以下のサイトを利用させてもらってC言語を勉強しようかと思っているのですが、このサイトは参考になりますか?(製作者様いやな言い方ですみません)

  • C++の為にCはどの程度理解する必要がありますか?

    1.C++を利用するにあたってどの程度Cを理解しているとコードが読めないプログラムを書けない等の弊害が出ない若しくは減少できるのでしょうか? 2.C及びC++の辞書的な利用ができる本でお勧めのもの等ありましたら教えていただけませんでしょうか? 3.テキストでは得にくいプログラミングやその周囲の情報(雑学等でも構いません)お勧めの書籍等ありましたら教えていただけませんでしょうか? 現在プログラミングに興味が湧き、C++を初学者向けのテキストで勉強していいます。 (現在使っているテキストではC言語の話が少なくなんとか学習できています) 多くのテキストがC言語学習者を対象としているため、実際どの程度C言語を理解している必要があるのか尋ねたく質問いたしました。 読みにくいとは思いますがどうか回答よろしくお願いいたします。