2

我必须将函数传递给指针。为此,我使用了 boost::function。捕获指针的函数针对不同的签名进行了重载。例如:

void Foo(boost::function<int ()>) { ... }
void Foo(boost::function<float ()>) { ... }
void Foo(boost::function<double ()>) { ... }

现在我想在那里传递一些类方法指针:

class test
{
   public:
      float toCall() { };
};

class Wrapper
{
  Wrapper() {
    test obj;
    Foo(boost::bind(&test::toCall, this));
  }
};


error: no matching function for call to ‘Foo(boost::_bi::bind_t<float, boost::_mfi::mf0<float, test>, boost::_bi::list1<boost::_bi::value<Wrapper*> > >)’
    note: candidates are: Foo(boost::function<float()>&)
4

3 回答 3

6

诺诺这行不通。因为boost::function<...>有一个模板化的构造函数来接受任何和所有类型。稍后会检查与调用签名的兼容性。重载解决方案无法解决此问题。

另外,我认为您想通过&obj而不是this. 尝试显式转换:

Foo(boost::function<float ()>(boost::bind(&test::toCall, &obj)));

虽然这非常难看,所以你可能想引入一个 typedef

void Foo(FloatHandler) { ... }
...
FloatHandler f(boost::bind(&test::toCall, &obj));
Foo(f);

或者最终你可以制作Foo一个只接受任何可调用类型的模板T。我怀疑这可能是最简单的,因为在一般情况下我怀疑你不知道boost::function<...>你需要投什么。想要返回std::complex<>. 所以...

template<typename T>
void Foo(T) { ... }
...
Foo(boost::bind(&test::toCall, &obj));

希望这可以帮助。

于 2010-08-30T23:23:54.067 回答
2

在行

Foo(boost::bind(&test::toCall, this));

this是类型Wrapper。但是绑定在上面找不到toCall方法。

这是一个固定版本(完整,在 g++ 4.3.2 上编译),这可能是您想要做的:

#include <boost/bind.hpp>
#include <boost/function.hpp>

void Foo(boost::function<int()>) {}
void Foo(boost::function<float()>) {}
void Foo(boost::function<double()>) {}

struct test {
  float toCall() {return 0.0f;}
};

int main(int,char**) {
  test obj;
  boost::function<float()> tgt=boost::bind(&test::toCall,obj);
  Foo(tgt);
  return 0;
}

正如 AndreyT 的回答所指出的,bind 的返回类型......有点奇怪,因此显式强制转换为适当的函数类型。

于 2010-08-30T23:26:22.993 回答
1

boost::bind不返回boost::function对象。它返回一个未指定类型的对象,该对象可用作具有相应数量参数的仿函数。

虽然boost::function可以从 的结果进行转换构造,boost::bind但这种情况下的重载决议对于 C++ 来说“太复杂”了。(删除了我的不好的例子,它并没有真正说明正确的问题)。

于 2010-08-30T23:16:01.043 回答