3

同様の宣言を持つ関数がいくつかあります。

int foo(int a);
int bar(int a);
int test(int a);

そして、私のメッセージ ハンドラーのロジックはまったく同じです。

void HandleFoo(int a) {
    process(a);
    int ret = foo(a);
    if (ret) 
        print(a);
}

void HandleBar(int a) {
    process(a);
    int ret = bar(a);
    if (ret) 
        print(a);
}

void HandleTest(int a) {
    process(a);
    int ret = test(a);
    if (ret) 
        print(a);
}

だから、一般的な関数を書くことが可能かどうか疑問に思っています:

void Handle(int a, func_pointer fn) {
    process(a);
    int ret = fn(a);
    if (ret) 
        print(a);
}

は、をfn受け入れることができる汎用関数ポインタのようなものです。foobartest

これは可能ですか?

ところで、現在私のプロジェクトでは C++11 とブーストはなく、TR1 のみを使用しています。

4

5 に答える 5

4

テンプレートを使用できます

例(正確にはあなたのコードではありません):

int add1(int n) { return n+1; }
int add2(int n) { return n+2; }

template<typename Adder>
void AddHandler(int n, Adder adder)
{
    int r = adder(n);
    std::cout << r << std::endl;
}

int main(void)
{
    AddHandler(1, add1);
    AddHandler(3, add2);

    return 0;
}

これは期待どおりに出力されます:

2
5

ここでライブを見ることができますhttp://ideone.com/q3FyI5

于 2013-07-31T08:25:46.017 に答える
1
typedef int (*fptr)(int ) ;

void Handle(int a, fptr fn) {
    process(a);
    int ret = fn(a);
    if (ret) 
        print(a);
}

int main()
{
    Handle(3,foo);
    Handle(4,bar);
    Handle(5,test);
}
于 2013-07-31T08:39:40.487 に答える
1

はい、そうです。使用する

void Handle(int a, int(*func)(int)) {
  process(a);
  int ret = (*func)(a);
}

次のように使用します。

Handle(some_a, &foo);

注: 例として投稿した 3 つの関数 return void、タイプミスを疑い、それらを に置き換えましたint

于 2013-07-31T08:19:06.143 に答える