std::function と ref classとlambdaとdelegate

公開:2012-06-24 15:08
更新:2020-02-15 04:37
カテゴリ:c++,c++/cx

下記のコードがコンパイルエラーになる。


MainPage::MainPage(GameMain^ g) : gameMain_(g)
{
  InitializeComponent();
  std::function<void (Windows::UI::Xaml::Controls::Page^ )> f(std::bind(&MainPage::Subframe,*this,std::placeholders::_1));
  gameMain_->SetSubFrameFunc(f);
}
void MainPage::Subframe(Windows::UI::Xaml::Controls::Page^ p){}

MainPageクラスはref classで、そのメンバ関数であるSubframeへのポインタにthisポインタをbindしてstd::functionに格納し、SetSubFrameFuncの引数として渡したいのだけれど、コンパイルエラーとなってしまう。

error C2064: 2 引数を取り込む関数には評価されません。

やっぱりdelegateを使わないといけないのかな..とか思いつつ、lambdaで囲えばいいのではと思ってやってみたらできた。




MainPage::MainPage(GameMain^ g) : gameMain_(g)
{
  InitializeComponent();
  //std::function<void (Windows::UI::Xaml::Controls::Page^ )> f(std::bind(&MainPage::Subframe,this,std::placeholders::_1));
  gameMain_->SetSubFrameFunc(
    [this](Windows::UI::Xaml::Controls::Page^ p)
    {
      Subframe(p);
    }
  );
}

void MainPage::Subframe(Windows::UI::Xaml::Controls::Page^ p)
{}

なんだかよくわからないが、これでいいや..。と思ったがさらにdelegateで書き直してみた。





  ref class GameMain : public DirectXBase
  {
  internal:

    delegate void SubFrameFuncDelegate(Windows::UI::Xaml::Controls::Page^ p);
    .
    .
    void SetSubFrameFunc(SubFrameFuncDelegate^ func)
    {
        subFrameFunction_ = func;
    }
    .
    .
  private:
    SubFrameFuncDelegate^ subFrameFunction_;
    .
    .
    .
  };
    .
    .
    .
    .
  MainPage::MainPage(GameMain^ g) : gameMain_(g)
  {
      InitializeComponent();
      //std::function<void (Windows::UI::Xaml::Controls::Page^ )> f(std::bind(&MainPage::Subframe,this,std::placeholders::_1));
      gameMain_->SetSubFrameFunc(ref new GameMain::SubFrameFuncDelegate(this,&MainPage::Subframe));
  }

  void MainPage::Subframe(Windows::UI::Xaml::Controls::Page^ p)
  {
  }

当初書きたかった形に落ち着いたね..。