具有默认参数的成员函数指针

2023-11-27

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

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

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);

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

另一方面,函数指针是运行时实体。它们在运行时初始化。在运行时默认参数根本不存在。 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)。这实际上对您来说是一个问题(因为您在示例中尝试了两者):如何you想要它发挥作用吗?与int (MyObj::*)()指针?或者用一个int (MyObj::*)(int)指针?

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

具有默认参数的成员函数指针 的相关文章

  • 如何使用 VS2022 中的新控制台应用程序模板访问命令行参数

    我想知道如何访问命令行参数 因为这是在Program cs通过 Visual Studio 2022 中控制台应用程序的新模板创建文件 See https aka ms new console template for more infor
  • 将列表数组中的值绑定到列表框

    任何机构都可以给出一个简短的示例 用于将列表数组中的值绑定到 c net 中的列表框 这取决于您的列表数组的情况 让我们从一个简单的示例开始 List
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • C++ 中类型信息何时向后流动?

    我刚刚看了 Stephan T Lavavej 的演讲CppCon 2018关于 类模板参数推导 在哪里某个点 https youtu be H ut6j1BYU t 941他顺便说 在 C 中 类型信息几乎永远不会向后流动 我不得不说 几
  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 来自资源中 ImageSource 的 System.Drawing.Image

    我的问题与这个非常相似 wpf图像资源以及运行时在wpf控件中更改图像 https stackoverflow com questions 940592 wpf image resources and changing image in w
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • 清理 TPL 中的 CallContext

    根据我使用的是基于 async await 的代码还是基于 TPL 的代码 我在逻辑清理方面得到了两种不同的行为CallContext 我可以设置和清除逻辑CallContext如果我使用以下异步 等待代码 正如我所期望的 class Pr
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 使 WCHAR 为空终止

    我有这个 WCHAR 文件名 1 作为函数的返回值 它是 sys 32 函数 因此我无法更改返回的类型 我需要使 fileName 以 null 结尾 因此我尝试将 0 附加到它 但似乎没有任何效果 一旦我得到一个以 null 结尾的 WC
  • Jasper Reports 使用 comparatorExpression 进行交叉表排序

    我正在尝试根据某些自定义方案对交叉表中的动态列进行排序 在文档中 我发现提到了comparatorExpression 交叉表组存储桶比较器表达式 这个表达式的结果是 用于按升序或降序对存储桶进行排序 如果没有比较器 指定表达式时 将使用自
  • 创建/更新文档日期的摄取管道

    我正在尝试实现类似于 Mysql 的行为 为我通过 ES 管道索引的每个文档的元数据添加 insert at updated at 我的管道是这样的 description Adds createdAt and updatedAt styl
  • 如何访问和处理嵌套对象、数组或 JSON?

    我有一个包含对象和数组的嵌套数据结构 如何提取信息 即访问特定或多个值 或键 例如 var data code 42 items id 1 name foo id 2 name bar 我怎样才能访问name中的第二项items 预赛 Ja
  • 如何使用 C# 从 MS Office 文档中提取文本

    我试图使用 C 从 MS Word doc docx Excel 和 Powerpoint 中提取文本 字符串 在哪里可以找到免费且简单的 Net 库来阅读 MS Office 文档 我尝试使用 NPOI 但没有获得有关如何使用 NPOI
  • 为什么 printf("%f",0);给出未定义的行为?

    该声明 printf f n 0 0f 打印 0 然而 该声明 printf f n 0 打印随机值 我意识到我表现出了某种未定义的行为 但我无法具体弄清楚为什么 所有位均为 0 的浮点值仍然有效float值为 0 float and in
  • 为什么我的 WSDL 仍然显示带有 http 位置值的基本 http 绑定?

    我启用了 https 绑定 但我的 WSDL 的肥皂地址为 http 有什么想法吗 谢谢
  • 糟糕的 DotNetNuke 性能

    我参与了一个项目 使用DotNetNuke 版本 05 01 04 社区版 我们正在使用它构建新的 Intranet 但性能很糟糕 我们有五个人向其添加页面和内容 每 15 30 秒一次他们经历了 10 秒的停顿或在系统继续并加载下一个屏幕
  • libgmalloc 如何与二级命名空间一起工作?

    我想编写自己的 malloc free 函数以进行调试 文档说我必须将 DYLD FORCE FLAT NAMESPACE 与 DYLD INSERT LIBRARIES 一起使用 但同时libgmalloc文章明确指出 libgmallo
  • 在应用程序启动时从故事板中选择替代的第一个视图控制器

    我刚刚开始 iOS 编程 到目前为止 我在这里找到的教程和答案对我的前进有很大帮助 然而 这个特殊的问题整夜困扰着我 我找不到 感觉正确 的答案 我正在编写一个连接到远程服务的应用程序 用户需要登录才能使用它 当他们开始使用应用程序时 他们
  • 如何在 read() 函数调用中实现超时?

    我想使用串行com端口进行通信 并且我想在每次调用时实现超时read 函数调用 int filedesc open dev ttyS0 O RDWR read filedesc buff len EDIT 我使用的是 Linux 操作系统
  • MATLAB:如何在 parfor 中设置随机种子以产生与 Serial for 相同的结果?

    我设置了以下最小示例 rng 0 randseedoffset random unid 10 5 1 t cell 10 1 for i 1 10 rng randseedoffset i t i random unid 1000 end
  • XML::LibXML 中实现了哪个版本的 XPath?

    有谁知道 XML LibMXL 中实现了哪个版本的 XPath 规范 或者更重要的是 在哪里可以找到可在 LibXML 中使用的 XPath 函数的描述 例如 我尝试过类似的东西 dcDOM gt findvalue dc identifi
  • C 有标准的 ABI 吗?

    来自讨论别的地方 C 没有标准的ABI 应用程序二进制接口 但C也没有 对吗 在任何给定的平台上它几乎都是如此 如果缺乏一种语言 它就无法作为跨语言交流的通用语言 您对此有何看法 C 没有定义 ABI 事实上 它竭尽全力避免定义 ABI 像
  • 如何在sklearn中对分类变量进行编码?

    我正在尝试使用 UCI 存储库中的汽车评估数据集 我想知道是否有一种便捷的方法可以在 sklearn 中对分类变量进行二值化 一种方法是使用 LabelBinarizer 的 DictVectorizer 但在这里我得到了 k 个不同的特征
  • 使用 HBase 进行行分页

    有没有办法在HBase中基于rowkey进行分页 我想要和我一样的效果SQL with SELECT FROM table LIMIT 10 OFFSET 10 如果这是不可能的 我应该如何最好地设计我的行键以进行适当的查询 您可以利用页面
  • 重新分配一次性对象变量是如何工作的?

    在 C 中 当用新对象重新分配一次性对象变量时 它在内存中如何工作 旧对象占用的内存空间会被新对象覆盖吗 或者我还需要打电话吗Dispose 释放它使用的资源 DisposableThing thing thing new Disposab
  • LINQ to Entities Union 引发错误

    我已经成功地完成了以下工作 var transactions from t in context Transactions group t Create Date Time by t Participation Id into t1 sel
  • 如何将类型应用于 NSFetchRequest 实例?

    在 Swift 2 中 以下代码有效 let request NSFetchRequest entityName String 但在 Swift 3 中它给出了错误 无法推断通用参数 ResultType because NSFetchRe
  • 具有默认参数的成员函数指针

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