tr1::mem_fn 和具有默认参数的成员

2024-01-05

我的类有一个带有默认参数的成员函数。

struct Class
{
    void member(int n = 0)
    {}
};

通过 std::tr1::mem_fn 我可以调用它:

Class object;

std::tr1::mem_fn(&Class::member)(object,10);

也就是说,如果我想调用callable使用默认参数的对象上的成员,正确的语法是什么?

std::tr1::mem_fn(&Class::member)(object); // This does not work

g++ 抱怨以下错误:

test.cc:17: error: no match for call to ‘(std::tr1::_Mem_fn<void (Class::*)(int)>) (Class&)’
/usr/include/c++/4.3/tr1_impl/functional:551: note: candidates are: _Res std::tr1::_Mem_fn<_Res (_Class::*)(_ArgTypes ...)>::operator()(_Class&, _ArgTypes ...) const [with _Res = void, _Class = Class, _ArgTypes = int]
/usr/include/c++/4.3/tr1_impl/functional:556: note:                 _Res std::tr1::_Mem_fn<_Res (_Class::*)(_ArgTypes ...)>::operator()(_Class*, _ArgTypes ...) const [with _Res = void, _Class = Class, _ArgTypes = int]

尽管如此,当 Class::member 被采用不同参数的成员重载时,我仍然遇到同样的问题......


默认函数在调用时绑定,但由于它们的实现方式,不能隐式绑定到任何类型的包装器中。当你通过时&Class::member, mem_fn只看到一个void (Class::*)(int),并且看不到默认参数。使用tr1::bind,您可以显式绑定默认参数:std::tr1::bind(&Class::member, 0)或者你可以像你想的那样使用它mem_fn,但不能在一个对象中同时执行这两项操作。您必须为此编写自己的包装类。

至于重载,您必须显式指定模板参数mem_fn所以选择正确的函数指针,如下所示mem_fn<void(int)>(&Class::member).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tr1::mem_fn 和具有默认参数的成员 的相关文章

随机推荐