2012-11-08 74 views
0

我可以在C++中实现以下功能吗? 我想保留myInstance变量未指定,直到调用回调方法,而不是将它包含在boost::bind实例中。boost :: mem_fn的正确类型是什么?

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函数吗?

回答

5

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

没有一个明确定义的类型的原因是,从bosst :: mem_fn返回的类型始终被假定为它传递给它的函数的模板参数。让我告诉你一个例子:

的std :: for_each的具有这样的特征:

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

的魔术这个小片有两个模板参数,一个InputIterator的和功能。这些可能被称为任何东西,但赋予它们的名称描述了它们将如何使用,实际上是比真实类型更多的自我记录名称。 InputIterator的类型可能类似std::vector<foo>::iterator - 关键是编译器会自动解决“InputIterator”在编译时的情况。它可以为你计算出这种类型。

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

那么简单的答案是,让你的call功能需要一个模板参数:

template<typename SomeSortOfFunction> 
void call(SomeSortOfFunction callback) 

,然后编译器应该解决SomeSortOfFunction是什么类型是从boost::mem_fn

+0

“这是编译器似乎在做一些非常神奇的事情的情况之一。”确实... 因此,我不允许将'callback'作为类中的字段存储以供将来使用,而不需要对类进行模板化?那么,我可以在不声明其模板类型的情况下持有'boost :: bind'的实例吗?谢谢你的回答,马特! – Vortico

3

返回返回boost::mem_fn的类型是未指定。您应该使用Matt的方法(即把它作为一个模板),或者单独的编译是对你很重要,使用类型擦除:

MyClass *myInstance; 

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

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

mem_fn返回类型是不是你应该曾经明确地键入或商店。它是在编译时通过参数的类型生成的。

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

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

总之,如果你有一个零参数方法class foo,返回void尝试存储在std::function<void(foo *)> men_fun。

相关问题