gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:11 26 4
gpt4 key购买 nike

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

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 被采用不同参数的成员重载时,我仍然遇到同样的问题......

最佳答案

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

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

关于c++ - tr1::mem_fn 和具有默认参数的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/294261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com