0

宣言は次のとおりです。

#include <functional>    

class A { ... };

double fA( std::function<double((A::*)(double))> fp) { ... }

エラーが発生します

関数 'double fA(std::function)': tb.cpp:32:8: エラー: 'fp' の型が不完全です

問題ないのに

double fA( double ((A::*fp)(double)) ) { ... }

この型をテンプレート パラメータとして に提供する正しい方法は何std::functionですか?

4

2 に答える 2

1

あなたが本当に何を望んでいるのか、私にはよくわかりません。への引数std::functionは、標準で述べられているように、自由な関数シグネチャでなければなりません:

template<class R, class... ArgTypes>
class function<R(ArgTypes...)>;

operator()引数は、関数オブジェクトによって提供されるの署名であることに注意してください。異なる型へのメンバーへのポインターにすることはできませんstd::function<>。作成されるオブジェクトへの戻り値の型と引数だけです。

関数宣言内の余分な括弧のセットは、std::functionメンバーへのポインターを引数として受け取り、double. その場合、への引数の署名にstd::function戻り値の型がありません。

std::function<double (void (A::*)(double))> fp;

次のように初期化できます。

double myfunc( void (A::*mptr)(double) ) {}
// ...
fp = myfunc;
于 2012-09-21T03:22:40.623 に答える
0

@chrisの提案に非常に似た何かをすることになりました.彼の例のコードは次のとおりです:

#include <functional>
#include <iostream>

struct S {
   void foo() {std::cout << i;};
   int i;
};

void bar(std::function<void()> func) {
    func();
}

int main() {
   S s1, s2;
   s1.i = 5;
   s2.i = 6;

   bar(std::bind(&S::foo, s1));
   bar(std::bind(&S::foo, s2));
}
于 2012-11-04T10:09:38.400 に答える