C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: グルー関数を自動生成するテンプレート


(過去ログ 60 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■34669 / inTopicNo.1)  グルー関数を自動生成するテンプレート
  
□投稿者/ 出水 (124回)-(2009/04/06(Mon) 01:17:51)

分類:[C/C++] 

C++で以下のようなことがやりたいです。

class Test1{
public:
int f1(int i);
int f2(int i);
};

class Test2{
public:
int f1(int i);
int f2(int i);
};

struct Param{
void *t;
int n;
}

template <typename T, typename F>
int autofunc(Param *p){
T *t = (T *) p->t;
return t->F(p->n);
}

int main(){
int (*foo[4])(Param *);

foo[0] = autofunc<Test1, Test1::f1>;
foo[1] = autofunc<Test1, Test1::f2>;
foo[2] = autofunc<Test2, Test2::f1>;
foo[3] = autofunc<Test2, Test2::f2>;
}

要するに、Paramを受け取ってTest1::f1のような関数を呼び出したいわけです。
そして、それを仲介する関数をテンプレートで自動的に作りたいです。

このソースではコンパイルできません。
この目的を達成するにはどう書けばいいのでしょうか。
引用返信 編集キー/
■34670 / inTopicNo.2)  Re[1]: グルー関数を自動生成するテンプレート
□投稿者/ επιστημη (1865回)-(2009/04/06(Mon) 01:47:55)
επιστημη さんの Web サイト
↓はずしてる希ガス。

#include <iostream>
using namespace std;

class Test1{
public:
  int f1(int i) { cout << "Test1::f1\n"; return 0; }
  int f2(int i) { cout << "Test1::f2\n"; return 1; }
};

class Test2{
public:
  int f1(int i) { cout << "Test2::f1\n"; return 2; }
  int f2(int i) { cout << "Test2::f2\n"; return 3; }
};

struct Param {
  void *t;
  int n;
};

template <typename T, int (T::*F)(int)>
int autofunc(Param *p){
  T *t = (T *) p->t;
  return (t->*F)(p->n);
}

int main(){
  int (*foo[4])(Param *);
  foo[0] = autofunc<Test1, &Test1::f1>;
  foo[1] = autofunc<Test1, &Test1::f2>;
  foo[2] = autofunc<Test2, &Test2::f1>;
  foo[3] = autofunc<Test2, &Test2::f2>;
}

引用返信 編集キー/
■34671 / inTopicNo.3)  Re[2]: グルー関数を自動生成するテンプレート
□投稿者/ 出水 (125回)-(2009/04/06(Mon) 02:21:00)
> ↓はずしてる希ガス。
ばっちりあってます!

どうもありがとうございます
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -