0

我可以在 C++ 中实现以下功能吗?我想myInstance在调用回调方法之前保持变量未指定,而不是将其包含在boost::bind实例中。

MyClass *myInstance;

void call(/* boost::mem_fn */ callback)
{
    // Somewhere in this function, the operator()() method
    // is called on the callback instance

    callback(myInstance);
}

call(boost::mem_fn(&MyClass::myMethod));

我知道这boost::mem_fn是一个返回特定对象的函数,但我不确定它的类型。文档说未指定作为其返回类型。其中一个boost::bind构造函数将此类型作为参数,但我无法在其实现中找到实际声明。另外,我什至可以存储我自己的这种特定类型的实例,还是严格供 boost 函数使用?

4

3 回答 3

5

这是编译器似乎在做一些非常神奇的事情的情况之一。

没有真正定义好的类型的原因是从 bosst::mem_fn 返回的类型总是被假定为它传递给的函数的模板参数。让我给你看一个例子:

std::for_each 有这样的签名:

template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function f);

这个小魔法片有两个模板参数,一个 InputIterator 和一个 Function。这些可以被称为任何东西,但是给它们的名称描述了它们将如何被使用,实际上,比真正的类型更像是自我记录的名称。InputIterator 的类型可能类似于std::vector<foo>::iterator- 关键是编译器将在编译时自动解析“InputIterator”是什么。它可以为您找出这种类型。

函数也是如此。只要你传递给它一些可以被调用的东西——也就是说,它的版本operator()与被调用的东西兼容for_each,那么你永远不需要知道 Function 是什么。

所以简短的回答是,让你的call函数接受一个模板参数:

template<typename SomeSortOfFunction>
void call(SomeSortOfFunction callback)

然后编译器应该解析SomeSortOfFunction为从返回的任何类型boost::mem_fn

于 2012-11-08T17:42:58.880 回答
3

的返回类型boost::mem_fn指定。您应该使用 Matt 的方法(即作为模板传递),或者如果单独编译对您很重要,请使用类型擦除:

MyClass *myInstance;

void call(boost::function<void(MyClass*)> callback)
{
    callback(myInstance);
}

call(boost::mem_fn(&MyClass::myMethod));
于 2012-11-08T17:54:23.147 回答
1

的返回类型mem_fn不是你应该明确输入或存储的东西。它是在编译时通过参数的类型生成的。

但是,它可以通过std::function(或boost::function)存储。

operator()签名men_fn是原始方法参数,const前面可能带有指向类的指针,并且返回值类型相同。只需使用该签名创建一个std::function,它就可以获取men_fn类型并存储它。

简而言之,如果您有一个零参数方法,请class foo尝试void将 men_fun 存储在std::function<void(foo *)>.

于 2012-11-08T19:05:00.520 回答