这是“标签调度”吗?

2024-01-07

假设我有一些代码:

void barA() { }
void barB() { }

void fooA() {
  // Duplicate code...
  barA();
  // More duplicate code...
}

void fooB() {
  // Duplicate code...
  barB();
  // More duplicate code...
}

int main() {
  fooA();
  fooB();
}

我想删除之间的重复代码fooA and fooB我可以使用许多动态技术,例如传递 bool 参数、传递函数指针或虚拟方法,但如果我想要编译时技术,我可以这样做:

struct A { };
struct B { };

template<typename Tag> void bar();
template<> void bar<A>() { }
template<> void bar<B>() { }

template<typename Tag> void foo() {
  // Duplicate code
  bar<Tag>();
  // More duplicate code
}

int main() {
  foo<A>();
  foo<B>();
}

我在其中引入了两个空的“标签”类来指示哪个bar使用和模板foo and bar基于标签类别。这似乎可以解决问题。问题:

  1. 这项技术有名字吗?这是“标签调度”的示例吗?从我读到的内容来看标签调度 http://www.boost.org/community/generic_programming.html#tag_dispatching它略有不同,涉及使用标签参数的函数重载。可能来自特征类中的 typedef 的标签。
  2. 是否有更理想的编译时技术来实现同样的效果?

Edit:另一种可能性是使用函数重载bar而不是模板专门化并将标签类作为参数传递:

struct A { };
struct B { };

void bar(A) { }
void bar(B) { }

template<typename Tag> void foo() {
  // Duplicate code
  bar(Tag());
  // More duplicate code
}

int main() {
  foo<A>();
  foo<B>();
}

这不是标签调度。正如您在问题中正确所说,如果您使用了某些编译时特征A and B区分两者,然后使用它在两个不同的重载之间进行选择。

标签调度的一个很好的例子是std::advance http://en.cppreference.com/w/cpp/iterator/advance通常被实施。该函数的签名是

template< class InputIt, class Distance >
void advance( InputIt& it, Distance n );

it可以进阶n如果满足 RandomAccessIterator 的要求,则在单个操作中定位。对于较小的迭代器,我们必须前进it循环中。因此,实现可能会执行类似于以下内容的操作:

namespace detail
{
  template<class InputIt, class Distance>
  void advance(InputIt& it, Distance n, std::random_access_iterator_tag) 
  {
    it += n;
  }

  template<class InputIt, class Distance>
  void advance(InputIt& it, Distance n, std::bidirectional_iterator_tag) 
  {
    if(n < 0) {
      while(n++) --it;
    } else {
      while(n--) ++it;
    }
  }

  template<class InputIt, class Distance>
  void advance(InputIt& it, Distance n, std::input_iterator_tag) 
  {
    assert(n >= 0);
    while(n--) ++it;
  }
}

template< class InputIt, class Distance >
void advance( InputIt& it, Distance n )
{
  detail::advance(it, n, 
                  typename std::iterator_traits<InputIt>::iterator_category());
}

我不知道你正在做的事情的具体名称。这只是一个如何遵循的示例DRY https://en.wikipedia.org/wiki/Don%27t_repeat_yourself原则。

If bar举了一个例子A and B作为一个论点,那么我会以不同的方式实现它。而不是制作bar一个函数模板,然后提供专业化,我会让重载解析为我完成这项工作。

void bar(A const&) { ... }
void bar(B const&) { ... }

但由于情况并非如此,因此提供明确的专业化似乎是做到这一点的正确方法。

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

这是“标签调度”吗? 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 使用数组 C# 中的值过滤数据表

    我有一个删除方法 它获取一个 GUID 数组 并且我有一个数据表 如何过滤数据表 使其仅包含 GUID public void delete Guid guidlist datatable template ReadTemplateList
  • 无效查询参数的 HTTP 404 与 400

    这是我的请求网址 http server com app user getuser userId 9999 http server com app user getuser userId 9999 注意userId是查询参数 未嵌入路径参数
  • 如何在 NEXT JS 中的路由之间传递状态?

    我的页面中有一个对象内的数据 我想从该页面重定向到另一个页面以及数据 如下面的代码 const redirectAppointmentStep1 value gt router push pathname Appointment booki
  • 使用“new”创建对象时使用“return”

    我今天发现了一些非常奇怪的事情 如果你使用构造函数创建对象并且new关键字 但是return来自构造函数的函数 其行为如下 新创建的 对象 是一个函数 这个新函数可以像平常一样调用 但是 如果您保留对this在构造函数中 this引用从构造
  • 在流体容器中,我可以使元素的高度和宽度一样吗?

    我正在使用 container fluid 并且对于使用 span2 等在列上进行水平宽度设置非常有效 我有一个独特的要求 即我想要呈现 方形 的东西 同时仍然享受 Bootstrap 响应式宽度设置的好处 有没有一种好方法可以确保我的元素
  • FormView 绑定中的 DropDownList

    我想将下拉列表绑定到List
  • jQuery 的scrollLeft 不起作用

    我刚刚推出http elliewauters com http elliewauters com有一个我想解决的小问题 该网站使用大量动画水平滚动从一个 页面 到下一个 页面 但刷新时大多数浏览器都会记住滚动位置并返回到之前的位置 我不想要
  • 如何在 Nginx 上使用 PHP 以不同用户身份运行 shell 脚本?

    尝试使用 POST 请求触发 shell 脚本 由 nginx 处理 到目前为止还没有成功 我拥有的 exec whoami nginx nginx x 220 498 Nginx web server var lib nginx sbin
  • AWS Lambda 函数 - 将 PDF 转换为图像

    我正在开发应用程序 用户可以在其中上传一些 pdf 格式的图纸 上传的文件存储在S3上 上传后 文件必须转换为图像 为此 我创建了 lambda 函数 该函数将文件从 S3 下载到 lambda 执行环境中的 tmp 文件夹 然后从 ima
  • 设置 Excel 列标题格式以获得更好的可见性和颜色

    我浏览了很多帖子 但没有找到执行以下操作的确切方法 很抱歉附上屏幕截图 只是为了更好的可见性 我也会写它 基本上它看起来像 Name of the Man Address of Man City Jordan NC LMN 输入 csv 看
  • CSS 预处理器还是 PHP?

    如果我用 PHP 编写代码 是否有理由使用 CSS 预处理器而不是 PHP 例如 我可以通过在标头中添加以下内容来在 CSS 文件中使用 PHP 这样我就可以向它传递变量 例如style php color 000 或者我可以使用类似的东西
  • jq:错误:test1/0 未在 处定义,第 1 行

    我有下面的 JSON 文件 并且在尝试在 shell 中动态向数组添加值时遇到错误 下面是一个 tmp json 文件 environments integration testing for jenkins job prod stagin
  • 使用 C# 驱动程序从 mongo 集合中获取 DateTime

    我有以下对象 public class QueueItem public long id get set public SiteMapRequestState State get set public int WorkerId get se
  • 如何查找Android设备的序列号?

    我需要为 Android 应用程序使用唯一的 ID 并且我认为设备的序列号是一个不错的选择 如何在我的应用程序中检索 Android 设备的序列号 TelephonyManager tManager TelephonyManager myA
  • 如何在 QML 中设置 MessageDialog 的默认按钮?

    默认按钮是 是 但我想将按钮 否 设置为默认按钮 怎么做 我看不到任何方法可以通过当前的方式实现这一目标MessageDialogAPI 但我也认为这是特定于平台的 这就是它被隐藏的原因 不过 您可以创建自己的对话框 import QtQu
  • 通过定时器写入数据库的后台任务

    如何在后台的计时器上写入数据库 例如 检查邮件并向数据库添加新信件 在示例中 我在写入数据库之前简化了代码 Microsoft 示例中的类名称 录音类本身 namespace EmailNews Services internal inte
  • Camunda 无法执行 groovy 脚本

    这是我的依赖项 compile group org camunda bpm springboot name camunda bpm spring boot starter webapp version 3 0 0 compile group
  • 文件浏览器java

    我希望在 Java 应用程序中拥有某种文件浏览器 例如 Windows 资源管理器 我只想要能够递归列出文件夹内文件的东西 有没有一种简单的方法可以做到这一点 我已经尝试使用 JFileChooser 但这不是我想要的 此代码片段允许您递归
  • TextView android:ellipsize="marquee" 未按预期工作

    我在 ListView 中有一些自定义元素 据了解 每个元素只是 LinearLayout 中的 TextView 当文本太长时 我希望 TextView 内的文本成为水平滚动的单行 我阅读了很多关于此问题的文章 并提出了一个应该可行的解决
  • 这是“标签调度”吗?

    假设我有一些代码 void barA void barB void fooA Duplicate code barA More duplicate code void fooB Duplicate code barB More duplic