gpt4 book ai didi

c++ - 带有默认参数的成员函数指针

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

我正在尝试创建一个指向具有默认参数的成员函数的指针。当我通过这个函数指针调用时,我不想为默认参数指定一个参数。根据标准,这是不允许的,但我以前从未发现任何标准不允许我无法以其他符合方式做的事情。到目前为止,我还没有找到执行此操作的方法。

这是说明我要解决的问题的代码:

class MyObj
{
public:
int foo(const char* val) { return 1; }
int bar(int val = 42) { return 2; }
};

int main()
{
MyObj o;

typedef int(MyObj::*fooptr)(const char*);
fooptr fp = &MyObj::foo;
int r1 = (o.*fp)("Hello, foo.");

typedef int(MyObj::*barptr)(int);
barptr bp1 = &MyObj::bar;
int r2 = (o.*bp1)(); // <-- ERROR: too few arguments for call

typedef int (MyObj::*barptr2)();
barptr2 bp2 = &MyObj::bar; // <-- ERROR: Can't convert from int(MyObj::*)(int) to int(MyObj::*)(void)
int r3 = (o.*bp2)();
return 0;
}

如果我不想为默认参数指定任何值,关于如何在符合 C++ 中执行此操作的任何想法?

编辑:澄清一下限制。我不想在调用或任何 typedef 中指定任何默认参数。例如,我不想这样做:

typedef int(MyObj::*barptr)(int = 5);

...我也不想这样做:

typedef int(MyObj::*barptr)(int);
...
(o.barptr)(5);

最佳答案

在您的示例中期望函数指针按照您期望的方式工作是相当奇怪的。 “默认参数”是一个纯粹的编译时概念,它是一种语法糖。尽管默认参数是在函数声明或定义中指定的,但它们实际上与函数本身无关。实际上,默认参数在调用点被替换,即它们在调用者的上下文中处理。从函数的角度来看,用户提供的显式参数与编译器隐式提供的默认参数没有区别。

另一方面,函数指针是运行时实体。它们在运行时初始化。在运行时默认参数根本不存在。 C++ 中没有“运行时默认参数”这样的概念。

一些编译器允许您在函数指针声明中指定默认参数,如

void foo(int);

int main() {
void (*pfoo)(int = 42) = foo;
pfoo(); // same as 'pfoo(42)'
}

但这不是标准的 C++,而且这似乎不是您要查找的内容,因为您希望“默认参数”值在运行时根据指针指向的函数更改。

只要你想坚持使用真正的函数指针(而不是函数对象,又名仿函数),直接的解决方法就是为你的函数提供一个不同名称的无参数版本,如

class MyObj 
{
public:
...
int bar(int val = 42) { return 2; }
int bar_default() { return bar(); }
};

int main()
{
MyObj o;

typedef int (MyObj::*barptr2)();
barptr2 bp2 = &MyObj::bar_default;
int r3 = (o.*bp2)();
return 0;
}

当然,这远非优雅。

实际上有人可以争辩说,我在上面对 bar_default 所做的事情可能是由编译器隐式完成的,作为一种语言特性。例如。给定类定义

class MyObj 
{
public:
...
int bar(int val = 42) { return 2; }
...
};

人们可能希望编译器允许以下内容

int main() 
{
MyObj o;

typedef int (MyObj::*barptr2)();
barptr2 bp2 = &MyObj::bar;
int r3 = (o.*bp2)();
return 0;
}

指针初始化实际上会强制编译器为 MyObj::bar 隐式生成一个“适配器”函数(与我之前示例中的 bar_default 相同),以及将 bp2 设置为指向该适配器。但是,目前 C++ 语言中还没有这样的功能。引入这样的东西需要付出比乍看起来更多的努力。

另请注意,在最后两个示例中,指针类型为 int (MyObj::*)(),这与 int (MyObj::*)(int)。这实际上是您的一个问题(因为您在示例中都尝试过):希望它如何工作?使用 int (MyObj::*)() 指针?或者使用 int (MyObj::*)(int) 指针?

关于c++ - 带有默认参数的成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225330/

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