如何消除该模板的歧义?

2024-02-02

我有一个类,它采用大小作为模板参数(现场演示 http://ideone.com/uPRNZH):

template <std::size_t SIZE> class A
{
    char b[SIZE];
}

它有多个用于不同目的的构造函数:

using const_buffer_t = const char (&)[SIZE];
using my_type = A<SIZE>;

A()                         : b{} {} // (1) no params
A(const_buffer_t)           : b{} {} // (2) copy contents of given buffer
A(const char * const)       : b{} {} // (3) copy as many items as they fit into the size
explicit A(const my_type &) : b{} {} // (4) copy constructor

// (5) copy as many items as they fit into the size
template <std::size_t OTHER_SIZE>
A(const char (&)[OTHER_SIZE]) : b{} {}

// (6) copy constructor from another sized A
// copy as many items as they fit into the size
template <std::size_t OTHER_SIZE>
explicit A(const A<OTHER_SIZE> &) : b{} {}

使用这组构造函数,以下说明没有问题:

// CASE 1
// Calls constructor 3: A<5>(const char * const)
// Expecting constructor 5: A<5>(const char (&)[11])
A<5> a("0123456789");

// CASE 2
// As expected, calls constructor 1: A<5>()
A<5> b();

// CASE 3
// As expected, calls constructor 4: A<5>(const A<5> &)
A<5> c(b);

// CASE 4
// As expected, calls constructor 6: A<5>(const A<9> &)
A<9> c(b);

但是打电话的时候A<5>("five")构造函数 2、3、4 和 5 之间存在不明确的调用。

所以我的问题是:

  • 为什么构造函数 3 优于构造函数 5CASE 1?
  • 有没有办法消除构造函数 2、3、4、5 当对象A<SIZE>是用与模板参数大小相同的静态数组构造的吗?

感谢您的关注。


在重载解析期间对转换序列进行排序时,数组到指针的转换被视为完全匹配(C++11 13.3.3.1.1/1 表 12)。与您的直觉相反,这意味着 (3) 和 (5) 同样适合A<5> a("0123456789");。领带断了 - 作为Xeo 在他的评论中说 https://stackoverflow.com/questions/23291042/how-to-disambiguate-this-template#comment35652352_23291042- 赞成非模板(3)。您可能会想通过将 (3) 也转换为模板来欺骗编译器:

template <typename=void>
A(const char * const) : b{} {}

但这样做会只会导致结构的歧义 http://ideone.com/2kNmWx。确实没有简单的方法可以消除歧义const char (&)[] and const char*重载:最好的解决方案可能是更改 (3) 以接受指针和长度:

A(const char * const, std::size_t) : b{} {
  std::cout << "size: " << SIZE << " ctor 3\n";
}

顺便说一句,我会注意到添加size_t论证const char* const构造函数也消除歧义A("five") case http://ideone.com/SLtms6.

编辑:但是,一种消除歧义的合理方法char*来自数组构造函数的构造函数 http://ideone.com/LUGs60,通过引用接受指针参数:

template <typename T,
  typename=typename std::enable_if<
    std::is_same<typename std::remove_cv<T>::type, char>{}
  >::type>
A(T* const&) : b{} { std::cout << "size: " << SIZE << " ctor 3\n"; }

[这个特殊技巧的功劳在于dyp https://stackoverflow.com/questions/23291042/how-to-disambiguate-this-template/23295859?noredirect=1#comment35669703_23295859,可能还有 Johannes Schaub 或 Yakk 或我(我很确定那不是我)。]

该模板通过引用有效地锁定实际类型(在发生数组到指针转换之前),然后限制对非指针类型的引用。

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

如何消除该模板的歧义? 的相关文章

  • C# 从带引号的字符串中删除分隔符

    我正在编写一个程序 必须从文本文件中带引号的字符串中删除分隔符 例如 Hello my name is world 必须 Hello my name is world 起初这听起来很简单 我认为是这样 但是您需要检测引号何时开始 何时结束
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • 无捕获 lambda 是结构类型吗?

    P1907R1 http www open std org jtc1 sc22 wg21 docs papers 2019 p1907r1 html 接受 C 20 引入结构类型 它们是非类型模板参数的有效类型 GCC 和 Clang 都接
  • TPL Dataflow如何删除块之间的链接

    我想知道 如何删除块之间的链接 换句话说 我想要与 LinkTo 相反 我想写一个基于 tlp 数据流的记录器 我编写了这个接口 并希望在需要时删除 ILogListener 的订阅 public interface ILogManager
  • 在 MS word .docs 中插入 MathMl 、 Tex 或 LaTex 方程?

    我一直在寻找 C 中 Net 的一些 dll 用于在 MS Word 中插入任何 MathMl Tex 或 LaTex 方程 我尝试了一些类似 DocX 的工具 但它们失败了 你知道吗 或任何提示如何做到这一点 谢谢 Word 2007 可
  • 从值获取键 - Dictionary>

    我无法通过指定值来获取密钥 我实现这一目标的最佳方法是什么 var st1 new List
  • 获取在 Unity 中实现接口的所有类型

    如果您只想知道解决方案 请跳至更新 我有一个应用程序 它使用以下代码来获取并运行许多工作方法 var type typeof IJob var types AppDomain CurrentDomain GetAssemblies Sele
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 要实现 XML 可序列化,从 ICollection 继承的类型必须具有 Add 的实现

    我有来自现有项目的 CSLA 1 x 框架 对象 我试图在新的 Net 4 0 项目中使用它 这些对象正在生产中使用 如果没有 2 组对象 我确实无法将它们转换为 2 x 或 EF 在我的 c webservice 中 当我尝试运行它时 我
  • 将二维整数作为 Readonly/const 存储在单独的类中,同时保持非公开

    这是我在使用这个地方作为我的 去处 以获取关于什么有效 无效 为什么等的一般意见之后的第一个问题 那么让我们试试这个 由于我的经验有限 我一直在尝试寻找更好的方法来创建固定数据字段 我可以在整个程序中引用这些字段 例如我反复显示的最终用户可
  • 命名空间中不存在类型或命名空间名称 - 但命名空间确实存在

    我已经工作了很长时间没有任何问题的项目突然开始抛出错误 例如 The type or namespace name xxx does not exist in the namespace yyy are you missing an ass
  • GridView必须添加到表单标签中才能渲染

    TextWriter tr new StringWriter HtmlTextWriter writer new HtmlTextWriter tr HtmlForm form new HtmlForm form Controls Add
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • 使用 C++20 概念避免 std::function

    过去 当我想要回调作为函数参数时 我通常决定使用std function 在极少数情况下 我绝对从不使用捕获 我使用了typedef改为函数声明 因此 通常我的带有回调参数的声明看起来像这样 struct Socket void on re
  • ASP .NET Core IIS 托管用户身份名称为空且 IsAuthenticated=false

    我在 IIS 上运行 ASP NET Core dll 使用 AspNetCoreModule 使用以前的 ASP NET 我可以通过以下方式获取用户身份名称 HttpContext Current User Identity Name 因
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 写入 Windows 7“预览”窗口区域

    如何使用 C 将控件写入或绘制到 Windows 7 预览区域 作为我正在讨论的示例 请在 Windows 7 中打开 Windows Media Player 并播放一首歌曲 播放歌曲时 最小化 Windows Media Player
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样

随机推荐

  • 数据网格复选框自动化

    我有一个带有复选框的数据网格 当我单击单元格时 我希望在选择包含该复选框的单元格时自动选中该复选框 它现在所做的是我需要选择单元格然后单击复选框 这对我们来说非常烦人
  • 如何在 Javascript 中使用 onPageLoad?

    我尝试使用 onPageLoad function alert hi 但这行不通 我需要它作为 Firefox 扩展 请问有什么建议吗 如果你想在普通 JavaScript 中执行此操作 只需使用window onload事件处理程序 wi
  • 如何制作 TortoiseSVN diff .dot 和 .dotx Word 模板文件

    TortoiseSVN 具有区分 Microsoft Word 文档修订版的惊人能力 这显然是通过以下脚本实现的 C Program Files TortoiseSVN Diff Scripts它调用 MS Word 进行比较 而不是使用
  • Rails 3 - 如何通过 order by 从模型中获取行号

    我正在制作一个小应用程序 其中包含排行榜概念 基本上 该模型只是一个player name 和一个current score 我想做的是获取特定玩家的排名 并且考虑到新的分数一直在出现 它需要是动态的 显然 我可以使用 order by 子
  • 如何使用 VBA 编辑电源查询的源?

    我正在尝试使用 VBA 编辑我的查询之一的源 这是我到目前为止所拥有的 Dim mFormula As String mFormula let Source Excel Workbook File Contents wbname null
  • 使用 d3 或 cytoscape 渲染家谱

    我在用 Javascript 生成漂亮的家谱时遇到问题 要求 每个孩子应该连接到树中的两个父母 而不是像某些图中的一个 我希望配偶在树上彼此相邻 相同的垂直位置 我想把节点按世代垂直组织起来 这样你就能一目了然地看到同一年代出生的人 随着时
  • 没有 (Show (Double -> Double)) 的实例

    我有以下代码 它使用牛顿法来近似某个数字的平方根 问题是当我运行它时 我收到错误 出了什么问题 我该如何解决 newtonRootSequence Double gt Double newtonRootSequence d newtonSe
  • Google 地图地理编码 API 速率限制不正确

    我正在向我公司使用的内部工具之一添加映射功能 长话短说 我们有大约 50 个需要放置在地图上的地址的列表 我使用 Google 地图 使其成为交互式地图 然后使用 javascript API 进行地理编码和添加标记 根据谷歌的文档 htt
  • 包含 对于带有 hashbang 的页面有害吗?

    谷歌关于这个元标签的说法是 以下重要限制适用 元标记只能出现在没有哈希片段的页面中 仅有的 可能会出现在内容字段中 元标记必须出现在文档的头部 Source https developers google com webmasters aj
  • 将字符串转换为列表。 Python [string.split() 表现得很奇怪]

    temp a b c print type temp string output a b c print type output list 所以我有这个临时字符串 它基本上是字符串格式的列表 我正在尝试将其转回列表 但我不确定有什么简单的方
  • DRF SerializerMethodField如何传递参数

    有没有办法将参数传递给 Django Rest Framework SerializerMethodField 假设我有模型 class Owner models Model name models CharField max length
  • 如何指定样式表在文档中出现的顺序?

    我有几个样式组件 使用withStylesHOC 来导出它们 但我无法覆盖某些规则 因为 jss 将 mui 样式表的顺序与我的组件的样式表混合在一起 如何才能将自己的风格坚持到底 我和我的团队也偶然发现了这个问题 并设法找到了解决方案 显
  • 运算符的优先级和结合性是什么?

    C 中运算符的优先级和结合性是什么 谁定义了运算符优先级和结合性 以及它与求值顺序有何关系 https stackoverflow com q 20767745 5740428解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴
  • 在 Matlab 中使用“spy”为不同的数字获取不同的颜色

    当我使用间谍检查稀疏模式时 它不会将某些元素与其他元素区分开 有什么办法可以做到这一点吗 例如 假设元素等于10是红色的并且所有元素都等于9是蓝色的 我可以把这个合而为一吗spy plot 我只能更改情节的大小和样式 您可以这样做 spy
  • 为什么 chromecast 客户端向接收器应用程序声明其高度和宽度为 720p?

    为什么 chromecast 向接收方应用服务器声明其客户端高度和宽度为 720p 我正在尝试显示非视频内容 并假设我能够使用完整的 1080p 分辨率 设备向电视报告其分辨率为 1080p 60hz 但如果您查看设备上的开发人员工具 它仅
  • Angular 与 ui.bootstrap 渲染空白页面

    我使用 Yeoman 创建了一个包含 bootstrap 的 Angular 应用程序 然后 我使用 Bower 按照自述文件中的说明安装 ui bootstraphttps github com angular ui bootstrap
  • 请介绍一个 Perl 或 Ruby 的多处理库

    在Python中我们可以使用多处理模块 如果 Perl 和 Ruby 中有类似的库 你会教它吗 如果您能提供一个简短的示例 我将不胜感激 Ruby 在 Ruby 中使用多个进程 https stackoverflow com questio
  • Ios NSDictionary 数组 - 对值和键进行分组

    我有以下结果NSDictionary数组的 Bath Keynsham nsham companies Bath Midsomer Norton Keynsham companies Bath Norton Radstock Keynsha
  • 在 IIS 中托管时出现 WCF“基本”传输安全问题

    我正在尝试使用 HTTPS SSL 基本客户端凭据和WebHttp绑定 http msdn microsoft com en us library system servicemodel webhttpbinding aspx 通过在线阅读
  • 如何消除该模板的歧义?

    我有一个类 它采用大小作为模板参数 现场演示 http ideone com uPRNZH template