boost :: mem_fn的正确类型是什么?

时间:2012-11-08 17:33:50

标签: c++ boost

我能在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函数?

3 个答案:

答案 0 :(得分: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中调用的版本兼容,那么你永远不需要知道函数是什么。

所以简短的回答是,让你的call函数采用模板参数:

template<typename SomeSortOfFunction>
void call(SomeSortOfFunction callback)

然后编译器应该将SomeSortOfFunction解析为boost::mem_fn

返回的类型

答案 1 :(得分:3)

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

MyClass *myInstance;

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

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

答案 2 :(得分:1)

mem_fn的返回类型不是您应该明确键入或存储的内容。它是在编译时通过参数类型生成的。

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

operator()的{​​{1}}签名是原始方法参数,可能men_fn指向前面提到的类,并且返回值类型相同。只需使用该签名创建const,就可以使用std::function类型并存储它。

简而言之,如果men_fn的归零方法返回class foo,请尝试将men_fun存储在void中。