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

Vor*_*ico 0 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));
Run Code Online (Sandbox Code Playgroud)

我理解这boost::mem_fn是一个返回特定对象的函数,但我不确定它的类型.文档说明未指定为其返回类型.其中一个boost::bind构造函数将此类型作为参数,但我无法在其实现中找到实际的声明.另外,我甚至允许存储我自己的这种特殊类型的实例,还是仅限于使用boost函数?

Mat*_*att 5

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

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

std :: for_each有这样的签名:

template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function f);
Run Code Online (Sandbox Code Playgroud)

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

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

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

template<typename SomeSortOfFunction>
void call(SomeSortOfFunction callback)
Run Code Online (Sandbox Code Playgroud)

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