如何消除该模板的歧义?

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(使用前将#替换为@)

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

  • 以文化中立的方式将字符串拆分为单词

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

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找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
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 数据网格复选框自动化

    我有一个带有复选框的数据网格 当我单击单元格时 我希望在选择包含该复选框的单元格时自动选中该复选框 它现在所做的是我需要选择单元格然后单击复选框 这对我们来说非常烦人
  • 如何在 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