当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《tr1::mem_fn和具有默认参数的成员》经验,为你挑选了1个好方法。

我有一个带有成员函数的类,它接受一个默认参数.

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

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

Class object;

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

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

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) (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被带有不同参数的成员重载时,我也有同样的问题......



1> coppro..:

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

至于重载,你必须显式指定模板参数,mem_fn以便选择正确的函数指针mem_fn(&Class::member).

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有