正确组织最终用户无法访问的模板化和非模板化功能的混合

2023-12-26

在我正在进行的一个项目中,我目前正在实现一个模板化的算法。我在组织函数声明和定义时遇到了一些问题,因为涉及模板(我问了一个问题here https://stackoverflow.com/q/25139535/884412关于如何处理非模板化函数与模板函数“分组”在一起)。然而,这让我想知道这些文件的一般正确组织方式。

我想分开所有的定义 from 所有声明(只是为了可读性目的,即使我必须将模板化定义包含回声明中)。

我得到的答案建议组织如下:

  • 声明文件algo.h对于所有函数声明
  • The 模板化的定义文件algo.tpp它将被包含在algo.h(模板需要在编译时声明)
  • (非模板化)定义文件algo.cpp不包含在任何地方。

如果所有定义的函数都应该对最终用户可见(即所有声明都在algo.h文件)。然而,有时我喜欢把我的大功能分解成更小的功能,但是我希望最终用户只能访问“大功能”,而不是其子部分。 在非模板设置中,我会这样做:

  • 声明文件algo.h将包含仅针对最终用户的声明(将通过包含访问)
  • 这些函数的定义将转到algo.cpp
  • 子功能的定义(和声明)将只在场 in the algo.cpp,允许我的大功能 in algo.cpp(其中声明的algo.h)使用它们,但不让最终用户可以访问它们。

如果这些子功能本身不是模板化的,而是由模板化函数使用的,那么这将不再起作用。模板化的子功能可以进入.tpp文件,被模板化的“大函数”使用,一切都很好。

然而,如果这些功能不是模板化的,它们会导致多重定义错误(即我之前的问题是关于什么的 https://stackoverflow.com/q/25139535/884412)如果放置在.tpp文件。另一方面,如果它们位于单独的.cpp文件中,它们要么可供最终用户访问(如果我将声明放在.h文件),或者无法访问旨在使用它们的大函数(如果我不将声明放在.cpp file).

组织功能的正确方法是什么,一些模板化和some not,其中一些应该可供最终用户访问,而另一些则不能访问到多个文件中?

理想情况下,(为了完整性),我正在寻找的答案将解决以下内容的放置(在.h, .tpp, .cpp,或其他适当的文件):

  • 模板化的客户端函数
  • 非模板化客户端函数
  • 模板化的客户端函数
  • 非模板化客户端函数
  • 上述所有内容的声明(当使用声明时)

短的近乎伪代码我想要的功能示例(没有文件分隔)

    // Templated sub-functionality, used by bigFunctionality,
    // but ideally not accessible to the end-user
    // This might not be possible since it is templated,
    // so I am content with putting it in the .tpp file
    template <typename Compare>
    void subFunctionality(Compare order, .. args ..){ /* impl */ }

    // Non-templated sub-functionality, used by
    // bigFunctionality, but NOT accessible to the end-user
    void moreSubFunctionality(.. args ..) { /* impl */ }


    // the main functionality, meant to be
    // accessible to everybody across all files:
    template <typename Compare>
    void bigFunctionality( .. non-templated args ..., Compare order){
         subFunctionality(order, .. args ..);
         moreSubFun(.. args ..);
         // more stuff
    }

再次,我正在研究如何将其分成多个文件(即使它们彼此包含在一起,因为它必须使用模板完成),部分是为了可读性目的,部分是为了可访问性。

只是为了澄清,这些是算法 --> 函数,而不是类。 (我知道将模板化和非模板化函数放入同一个模板化类中可以解决我的问题)。

PS: I know the title of the question is very big and long, so if somebody has an idea about shortening it, I would be more than happy for the suggestions/edits


这是 C++ 中缺少模块的一个不幸的副作用:声明的内容必然是可见的。

一般来说,指导原则是简单地使用“私有”命名空间(嵌套在用户可见的命名空间内):

  • 使用清晰的名称(例如internal)
  • 并仅在您的名称空间中声明这些辅助函数.tpp file

然后,您记录该命名空间是内部的且不适合客户端调用者。如果可能,您还可以对命名空间/函数进行注释,以便不会为它们生成文档。

此时,这些函数是明显是私人的 and hidden.

如果您想更进一步,您可以简单地声明它们private in a class(*),然后只有your函数是friend这个班级的。然后,任何使用它们的尝试都会导致编译器发出错误:它们是可见的,但是无法访问。然而,大多数人(从 Boost 开发人员开始)只是不打扰,我当然也不打扰。

(*) The class本质上取代了私有命名空间。

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

正确组织最终用户无法访问的模板化和非模板化功能的混合 的相关文章

  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 在 foreach 循环外部使用 foreach 循环的变量

    我有一个 foreach 循环 我在循环内创建了一个字符串 但我想在循环外使用 var 这可能吗 List
  • .NET版本和C#版本之间的关系? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何确定可以针对特定 NET Framework 版本使用哪个版本的 C 我读过了 https sta
  • Git 精选语法和合并分支

    所以我之前已经做过无数次樱桃挑选 看来我现在必须在生活中失败 我正在尝试从一个分支挑选到另一个分支 这应该很容易 但是我收到了关于它是合并的错误 但是没有给出 m 吗 git cherry pick a8c5ad438f6173dc34f6
  • Mono无法打开sqlite数据库

    我正在尝试对 sqlite v3 数据库进行非常基本的连接 并且我正在使用 monodevelop 3 0 和 Mono 2 10 但无法连接到数据库 我可以让应用程序创建数据库 但随后它尝试连接到数据库时立即失败 有什么建议么 我从不同的
  • 查找可点击的元素

    有没有办法找到用 click 或 live click 指定的所有可点击元素 如果单击任何此类元素 我想执行一些操作 container bind click function event actions 这个捕获所有点击 Thanks 这
  • 如何使用时区偏移格式化 LocalDateTime

    我尝试这样做 ZoneOffset zoneOffset ZoneOffset ofHours 3 DateTimeFormatter fmt DateTimeFormatter ofPattern HH mm ss LocalDateTi
  • 如何确定我的 iOS 设备是否有手电筒?

    在我的应用程序中 我可以选择手电筒 然而 只有 iPhone 4 和 iPhone 4S 有手电筒灯 其他设备没有手电筒灯 如何找到当前设备型号 请帮我 提前致谢 您不应使用设备型号作为是否存在某项功能的指示符 相反 请使用 API 来准确
  • blur.js 尝试请求“none”并且 div 未扩展 100%

    我正在尝试使用http blurjs com http blurjs com 模糊标题栏的标题图像的背景 然而 它给了我一个有趣的错误 我似乎无法追踪 这可能与主要代码和兼容性有关 但我不确定 http jordan rave5 com t
  • 在 Numpy(或 Scipy)中计算斜率

    我正在尝试找到使用 Numpy 和 Scipy 计算斜率的最快 最有效的方法 我有一组由三个 Y 变量和一个 X 变量组成的数据集 我需要计算它们各自的斜率 例如 我可以轻松地一次一行执行此操作 如下所示 但我希望有一种更有效的方法来执行此
  • 按下 iOS swift 后更改 UIBarButtonItem 图标

    In the viewDidload方法 我声明了一个按钮并设置了 RightBarButton let btnFavourite UIButton frame CGRectMake 0 0 30 30 btnFavourite addTa
  • 找不到任何与 com.google.android.gms 匹配的版本:strict-version-matcher-plugin:[15.0.0, 16.0.0)

    项目一直运行良好 直到前两天突然出现错误 我不知道如何解决它 因为我已经做了我能做的一切 包括重新安装 android studio 和 gradle 无法解析配置 app debugCompileClasspath 的所有文件 找不到与
  • Array.push 返回推送值?

    是否有任何实质性原因需要修改Array push 返回推送的对象而不是新数组的长度可能是一个坏主意 我不知道这是否已经被提议或询问过 谷歌搜索只返回了大量与当前功能相关的问题Array push 这是此功能的示例实现 请随意更正它 func
  • ChildNode 类型上不存在属性“tagName”[Typescript]

    我正在从父节点循环子节点 我想访问子节点的 tagName 但错误是 tagName 在类型 ChildNode 上不存在 const contentParsed new DOMParser parseFromString content
  • 创建 LocalDB 以从 Visual Studio SQL 项目进行测试

    我正在尝试为我的项目创建集成测试 我需要测试一个通过存储库调用存储过程的控制器 应在每次运行某些范围的测试时创建一个空数据库 所以我将实施以下步骤 Create LocalDB 运行一些预脚本 以添加测试数据 Run test 运行一些后脚
  • GIMP的图层合成/混合方法

    在我寻求为 Matlab 中的图像混合工具添加 Alpha 功能时 我遇到了一些障碍 其中 我一直在使用these http ssp impulsetrain com porterduff html links http www adobe
  • 显示一个 div,单击时隐藏所有其他 div

    我有一个简单的图像 视频库 我想用 jQuery 制作动画 我想要做的就是 当有人点击链接时 big具有相同ID的div被设置为display block opacity 1所有其他 div 都设置为display none opacity
  • 将多通道 PyAudio 转换为 NumPy 数组

    我能找到的所有例子都是单声道的 CHANNELS 1 如何使用 PyAudio 中的回调方法读取立体声或多声道输入并将其转换为 2D NumPy 数组或多个 1D 数组 对于单声道输入 类似这样的工作 def callback in dat
  • NodeJS 中的 Rijndael 256 CBC PKCS7 加密/解密

    我正在为一项服务构建一个 NodeJS 客户端 该服务使用 256 位块 Rijndael CBC 和 PKCS7 填充来加密数据 我看过 NodeJS 中的几个 Rijndael 实现 但似乎没有一个提供我正在寻找的组合 如何使用Rijn
  • 从 python hook 调用 Mercurial 命令(“hg update”)

    我在 Windows 2008 64 位和 IIS 上设置了 Mercurial hgweb 存储库的位置是网络共享 我想在存储库上创建一个挂钩 以在更改组上发出 hg update 命令 我无法使用外部挂钩 因为这会以网络共享作为工作目录
  • 正确组织最终用户无法访问的模板化和非模板化功能的混合

    在我正在进行的一个项目中 我目前正在实现一个模板化的算法 我在组织函数声明和定义时遇到了一些问题 因为涉及模板 我问了一个问题here https stackoverflow com q 25139535 884412关于如何处理非模板化函