1

関数の引数から非型の 関数ポインタ型のテンプレート引数(関数ポインタ)を推測することは可能ですか?

template <void(*fptr)()>
  void test(void(*fp)()) { fp(); }

この関数を呼び出すには、関数テンプレート パラメーターを明示的に宣言する必要があります。

test<somefunc>(somefunc);

私はこの方法でもできることを知っています:

template <void(*fptr)()>
  void test() { fp(); }

test<somefunc>();

しかし、私はこのようにすることが可能かどうか疑問に思っています:

template <void(*fptr)()>
  void test() { fp(); }

test(somefunc);

コンパイラ (GCC 4.7) が関数の引数から推測するような方法で宣言することは可能ですか?

これを行う方法を本当に疑問に思っていました。-ブライアン

4

4 に答える 4

4

関数の引数から非型のテンプレート引数 (関数ポインタ) を推測することは可能ですか?

いいえ。関数の引数は実行時のエンティティであり、テンプレートの引数はコンパイル時のエンティティです。推測するには、そのようなテンプレート引数を実行時に推測する必要がありますが、これは不可能です。

于 2012-09-07T16:10:07.620 に答える
1

ブライアン、それは低レベルの C と C++ の非常に風変わりな組み合わせのようです。なぜそれが必要なのですか?ファンクタを使用しないのはなぜですか?

struct clean
{
    void operator() () 
    {
        // do something here        
    }
};

template <typename FuncType> void call_func(FuncType func)
{
    func();
}

// here is how to pass 'clean' to be called
call_func(clean());

ファンクタの詳細については、たとえば、http ://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html を参照してください。

于 2012-09-07T16:19:51.950 に答える
1

私はこれがあなたが望むことをするかもしれません:

関数型をまだ持たないベース テンプレートを宣言します。

template <typename T> void test(T fp) { printf("function signature not supported\n"); }

関数型 (主に引数の数) に特化:

typedef void(fptr0)();
template <> void test(fptr0 fp) { fp(); }
typedef void(fptr1)(int);
template <> void test(fptr1 fp) { fp(1); }

いくつかのテスト関数を異なる署名で宣言します。

void myfn0() { printf("hi 0\n"); }
void myfn1(int x) { printf("hi 1:%i\n",x); }
void myfnD(float y) { printf("hi D %f\n",y); }

それらを実行します。

int main(int,char**) {
   test(myfn0);
   test(myfn1);
   test(myfnD);
   return 0;
}

結果:

hi 0
hi 1:1
function signature not supported
于 2012-09-07T16:31:44.973 に答える
0

これはあなたが探しているものですか?

#include <iostream>

typedef void (*fptr)();

void f() {
    std::cout << "hello, world\n";
}

template <class fptr> void g(fptr fp) {
    fp();
}

int main() {
    g(f);
    return 0;
}
于 2012-09-07T16:46:31.270 に答える