如何将模板参数限制为指针或随机访问迭代器?

2023-12-07

有没有办法将模板函数的参数类型限制为仅指针或随机访问迭代器?

假设我正在开发一个排序功能,该功能仅适用于可随机访问的容器。我正在寻找一种在用户传递非随机访问迭代器时抛出编译时错误的方法。

#include <type_traits>
#include <iterator>

template <class Iterator> void mySort(Iterator begin, Iterator end){

    /*The below condition must be true if the 'Iterator' type is a pointer 
    or if it is of Category random_access_iterator_tag. How to make such check?*/
    static_assert(some condition, "The mySort() function only accepts random access iterators or raw pointers to an array.\n");

    for (Iterator it = begin; it != end; ++it){
        /*Some kind of sorting is performed here, which 
        uses arithmetic operators + and - in the iterator type. */
    }
}

我知道要检查类型是否是指针,我可以使用std::is_pointer<Iterator>::value并检查迭代器是否是随机访问我可以使用std::is_same<std::random_access_iterator_tag, Iterator::iterator_category>::value.

第一个问题是两个检查应该在同一个检查中进行“或”运算static_assert(),否则如果其中一个匹配,另一个就不会。

第二个问题是,如果以这种方式调用该函数,随机访问检查将会失败:mySort<int*>(...)。这显然是从那时起发生的int*没有::iterator_category定义。

有人知道如何解决这个问题吗? 我还知道编译器会在尝试将算术运算符与非随机访问迭代器一起使用时自动抛出错误,但我想通过显示更全面的错误消息static_assert().

作为后续问题。如果“Iterator”是指针类型,有没有办法断言它是原始类型(非struct/class)?

先感谢您。


使用迭代器特征:

static_assert(
    std::is_same<std::random_access_iterator_tag,
                 typename std::iterator_traits<Iterator>::iterator_category>::value,
    "The mySort() function only accepts random access iterators or raw pointers to an array.\n");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将模板参数限制为指针或随机访问迭代器? 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0

随机推荐

  • 使用 Count 获取 HTML 列中最常见的前 10 个项目

    我有一个有点混乱的查询要尝试弄清楚 我有一个名为 meta value 的列 其中有一些 HTML 数据 例如 tr class child row123 td class monsters Monster td td class mons
  • 控制器如何与 AngularJS 中的指令对话?

    我有一个显示 4 个闪存卡的应用程序 其中 3 个由一个指令填充 对于最后一张卡 我希望该值取决于控制器 根据视图 和相应的控制器 控制器可以填写第四张卡的值 出于演示目的 请参阅here Question 如何从某个控制器更新第四张卡中的
  • 无法将“[(String)]”类型的值分配给“String!”类型的值?

    woodText text String textForWood values 这是我的代码 woodText is a UITextView and textForWood是一本字典 请帮忙 woodText text textForWo
  • 对每个实例后有冷却期的事件进行计数

    在 Postgres DB 中 我有 事件 条目 与 ID 相关联 以及事件发生的时间 我需要用特殊的规则来计算它们 当事件发生时 计数器会递增 并且在接下来的 14 天内 所有此类事件都不会被计数 Example event create
  • Datagridview:如何将单元格设置为编辑模式?

    我需要以编程方式将单元格设置为编辑模式 我知道将该单元格设置为 CurrentCell 然后调用方法 BeginEdit bool 应该会发生 但就我而言 它不会发生 我真的希望 当我的 DGV 有几列时 用户只能选择并编辑前两列 其他列已
  • Android 中的共享偏好设置

    我是安卓开发新手 我有一项活动 其中需要用户名和密码 我将这些值传递给一个 Web 服务 该服务返回一个密钥作为响应 我的活动中有一个切换按钮 现在 如果用户检查切换按钮 则意味着他想保持登录状态 并且当用户下次登录时应将其重定向到下一个活
  • 在 SSO 身份验证后设置 FormsAuthentication

    我的 ASP NET MVC 4 应用程序通过在 IIS 上运行的 ISAPI 筛选器受 SSO OAM 保护 当收到对我的应用程序的请求时 ISAPI 过滤器会拦截该请求并将其重定向到 SSO 用户必须登录 SSO 然后返回到我的应用程序
  • 实时视频流 iPhone

    我是 iphone 和 Objective c 的新手 我想向使用我的应用程序的用户展示一场现场比赛 假设是足球比赛 在 iPhone 应用程序中进行实时视频流需要什么 任何有关这方面的信息表示赞赏 Thanks 请大家帮忙 有人以前一定做
  • 如何在REST中实现资源的复制粘贴?

    您将如何以 RESTful 方式实现复制粘贴支持 假设我有书店资源 还有每家商店里的书 http mydomain com rest book stores 1 http mydomain com rest book stores 1 bo
  • 如何使用 Hive 使用单个 hdfs 路径创建 n 个外部表

    是否可以使用 Hive 创建 n 个指向单个 hdfs 路径的外部表 如果是的话 其优点和局限性是什么 可以在 HDFS 中的同一位置上创建许多表 同时管理和外部表 在相同数据之上创建具有完全相同架构的表根本没有用 但是您可以创建具有不同列
  • 在实体框架上使用 linq c# 进行分组

    我需要按名称分组并对名称的所有实例求和 这是我在控制器中的代码 public class FansController Controller private dbFan db new dbFan public ActionResult In
  • 为什么我们不能使用进程 ID 来代替我们绑定的端口

    为什么我们不能使用进程ID来代替我们在套接字编程中绑定的端口 在套接字编程中 我们创建套接字并获取套接字描述符 然后绑定到特定端口 对于多个连接 为什么我们不使用进程ID 因为所有连接也是返回进程ID的进程 这是一个有趣的想法 但我认为它会
  • 使用 utf8 的 MySQL 全文搜索(波斯语/阿拉伯语)

    我在 UTF8 Unicode 波斯语 阿拉伯语上进行全文搜索时遇到问题 从查询中找不到任何内容 表在编码上使用 utf8 utf8 persian ci 设置 Using mysql query SET NAMES UTF8 用于 Uni
  • Xamarin Forms 列表视图在框架中显示行项目

    您能给我推荐一些示例代码来创建如图所示的框架线吗 正如您在图像中看到的 例如对于第一行 M 应位于一个框架中 而该行中的所有其他 3 个项目应位于另一行中 下面请查看我的代码 感谢任何帮助
  • 如何隐藏平板电脑中的系统导航栏?

    在我的平板电脑上 它有以下栏来控制后退 主页等 我不知道正确的名称 状态栏 控制栏 操作栏 或其他 在程序中 它使用以下方法来实现全屏 requestWindowFeature Window FEATURE NO TITLE getWind
  • 如何将 Excel 工作表导出到新工作簿

    我有一堆包含多个工作表的 Excel 工作簿 我想循环遍历每个工作簿并将每个工作表导出到它自己的新工作簿中 我想要每个新工作簿中都有一个工作表 这是我到目前为止所得到的 Sub ExportWorksheet ByVal worksheet
  • C++ 在 Windows 中发送简单信号

    Windows 上是否有相当于kill 的函数 int kill pid t pid int sig 如果没有 是否可以根据进程的 PID 来测试进程是否正在运行 Thanks Windows 没有 Unix 意义上的信号 您可以使用Ope
  • 构建财务报表数据库

    我正在寻找构建数据库的最佳方法 我有 1000 家公司从 1997 年到 2012 年的季度财务报表 每家公司都有三份不同的报表 损益表 资产负债表和现金流量表 我希望能够对数据执行计算 例如将每个季度相加以获得每个报表上每个行项目的年度总
  • 十六进制字符串转中文字符串

    我有以下代码可以从十六进制转换为 ASCII Hexadecimal to ASCII Convertion private static string hex2ascii string hexString MessageBox Show
  • 如何将模板参数限制为指针或随机访问迭代器?

    有没有办法将模板函数的参数类型限制为仅指针或随机访问迭代器 假设我正在开发一个排序功能 该功能仅适用于可随机访问的容器 我正在寻找一种在用户传递非随机访问迭代器时抛出编译时错误的方法 include