热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何将多个函数重载作为单个参数传递?

如何解决《如何将多个函数重载作为单个参数传递?》经验,为你挑选了2个好方法。

这是试图摆脱宏的另一种情况.考虑

void f_(int i) { printf("f_(int)\t%d\n", i); }
void f_(int i, double x) { printf("f_(int, double)\t%d, %5.3f\n", i, x); }
void g_(int i) { printf("g_(int)\t%d\n", i); }
void g_(int i, double x) { printf("g_(int, double)\t%d, %5.3f\n", i, x); }

(想象一下f_().foo文件中获取数据或使用硬编码的"虚拟"值,g_().bar执行相同操作.)可能有一个函数来决定调用哪个重载:

void f(int i, double d) { (i > 0) ? f_(i, d) : f_(i); }

具有相同的逻辑重复g_():

void g(int i, double x) { (i > 0) ? g_(i, x) : g_(i); }

使用宏可以轻松删除重复的代码:

#define h(i, x, func_) (i > 0) ? func_(i, x) : func_(i);
// ...
h(-1, 314.1, f_);
h(99, 314.1, f_);
h(-1, 314.1, g_);
h(99, 314.1, g_);

但当然我们宁愿不在C++中使用宏."明显"的模板

template
void h2(int i, double x, T t)
{
   (i > 0) ? t(i, x) : t(i);
}
// ...
h2(-1, 314.1, f_);

失败,因为编译器无法弄清楚f_()要使用的重载.

如何替换宏的功能h



1> NathanOliver..:

您可以使用可变参数lambda并让lambda调用您想要调用的函数.

template
void h2(int i, double x, T t)
{
   i > 0 ? t(i, x) : t(i);
}

int main()
{
    h2(-1, 314.1, [](auto... args){ f_(args...); });
    //                              ^^ change this to g_ if you want to use g_ instead of f_
}



2> Caleth..:

如果你不介意改变定义的中f_g_,你可以这样做

template struct overloaded : Ts... { using Ts::operator()...; };
template overloaded(Ts...) -> overloaded;

auto f_ = overloaded(
  [](int i) { printf("f_(int)\t%d\n", i); },
  [](int i, double x) { printf("f_(int, double)\t%d, %5.3f\n", i, x); }
);

auto g_ = overloaded(
  [](int i) { printf("g_(int)\t%d\n", i); },
  [](int i, double x) { printf("g_(int, double)\t%d, %5.3f\n", i, x); }
);

然后你的h模板正是你想要的

template
void h(int i, double x, T t)
{
   i > 0 ? t(i, x) : t(i);
}

overloaded模板无耻地从复制这个例子std::visit.

要使其适用于C++ 11,您必须调整overloaded模板并添加辅助函数以推断类型参数

template struct overloads;
template<> struct overloads<>{};
template struct overloads : T, overloads 
{ 
    overloads(T t, Ts... ts) : T(t), overloads(ts...) {}
    using T::operator(); 
};

template overloads overloaded(Ts&&... ts) 
{ return overloads(std::forward(ts)...); }


@Ð是一个技巧是制作单个对象而不是单个名称.我只记得`std :: variant`示例作为一种有用的模式
@rustyx我认为你可以做一个C++ 11变体,它只涉及一个`make_`函数而不是一个演绎指南
推荐阅读
  • 数据结构-图详解(图基本概念、图的存储结构及C++实现)
    本文主要介绍关于数据结构,c++,图论的知识点,对【数据结构-图详解(图基本概念、图的存储结构及C++实现)】和【数据结构图的存储结构代码】有兴趣的朋友可以看下由【NUC_Dodamce】投稿的技术文 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • C++程序员视角下的Rust语言
    自上世纪80年代初问世以来,C就是一门非常重要的系统级编程语言。到目前为止,仍然在很多注重性能、实时性、偏硬件等领域发挥着重要的作用。C和C一样&#x ... [详细]
  • 如果您是Java开发人员,您会发现Rust相对容易掌握,这要归功于这两种语言的相似性。technology-most-loved-dreaded-and-wantedclass& ... [详细]
  • C++简单单向链表实现
    #include?pch.h#include?创建链表typedef?struct?ListTable?{int?nElement;????链表元素int?nSequence;???节点序号ListTable?* ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 环境Time2022-04-11Rust1.60.0前言说明基于标准库来学习各种数据结构,并不是从头实现数据结构,未考虑实现性能。特点相比较二叉树,二叉搜索树的左节点都比父节点小, ... [详细]
  • [置顶]        C++类的构造函数与析构函数的调用顺序
    1构造函数的调用顺序[1]构造函数按此顺序执行工作:按声明顺序调用基类和成员构造函数。如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。 ... [详细]
  • 如何用Vscode和 Visual stdudio配置C++环境
    这篇文章主要讲解了“如何用Vscode和Visualstdudio配置C++环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深 ... [详细]
author-avatar
cuishy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有