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 回答