我能在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函数?
答案 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
中。