函数模板在另一个类/命名空间中的专业化?

2024-06-20

注意:这个问题与tinyxml只是松散相关,但是包括这样的细节可能有助于更好地说明这个概念。

我编写了一个函数模板,它将迭代父 XML 节点子节点,检索子元素的值,然后将该子元素值推送到向量。

“检索值”部分也写为函数模板:

i.e.

template <typename Type>
Type getXmlCollectionItem(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);

检索部分有专门化,用于返回不同类型的子元素值,例如std::string 和其他自定义对象。

i.e.

template <>
std::string getXmlCollectionItem<std::string>(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);

template <>
MyObject getXmlCollectionItem<MyObject>(
    const char* elementName, TiXmlNode* child, TiXmlNode* parent);

这一切都运行得很好,但令我震惊的是,在处理tinyxml 文件时,将其放在共享函数库中会非常有用。

问题:是否可以在一个命名空间中声明一个函数模板,例如namespace UtilityFunctions,它不了解特定对象类型,例如'MyObject',然后在其他命名空间中声明并定义该函数模板的专业化,这些命名空间确实具有特定对象类型的知识,例如'MyObject'?

我的预感是这是不可能的,但在我看来,拥有通用函数模板的概念似乎足够有用,因为有一种替代方法可以接近我正在寻找的功能......

如果任何术语不正确或解释不清楚,我们深表歉意。我围绕这个主题做了很多研究(以达到在同一名称空间内工作函数模板专业化的目的),但尚未找到明确的答案。


不可能写在一个命名空间中定义的模板的专门化在另一个命名空间中(因为这不是该模板的专业化,在另一个名称空间中定义它将是一个不同的模板)。

然而,扩展最初定义模板的名称空间是完全可以的,将您的专业化写入完全独立的源文件中。

所以这就是你的cannot do:

namespace A { namespace B {
  template <typename T> int foo(T) {throw 1;}
}}

template <> int A::B::foo(int) {throw 0;}

您可以在以下位置看到上述内容的不错的错误消息:http://www.comeaucomputing.com/tryitout/ http://www.comeaucomputing.com/tryitout/

"ComeauTest.c", line 5: error: the initial explicit specialization of function
          "A::B::foo(T) [with T=int]" must be declared in the namespace
          containing the template
  template <> int A::B::foo(int) {throw 0;} 
                        ^

这就是你的can do:

namespace A { namespace B {
  template <typename T> int foo(T) {throw 1;}
}}

namespace A { namespace B {
  template <> int foo(int) {throw 0;}
}}

有什么理由会出现问题吗?

另外,如果您将工作委托给与您正在读取的对象关联的函数(成员函数或自由函数),则可以依赖通过 ADL 找到并调用该函数。这意味着您应该能够最大程度地减少上述此类专业化的数量。

这是示例:

namespace A { namespace B {
  template <typename T> int bar(T t) {return 0;}
  template <typename T> int foo(T t) {return bar(t);}
}}

namespace C {
  struct Bah {};
  int bar(Bah&) {return 1;}
}


int main(int argc,char** argv) 
{
  C::Bah bah;

  std::cout << A::B::foo(0) << std::endl;
  std::cout << A::B::foo(bah) << std::endl;
}

Edited添加示例

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

函数模板在另一个类/命名空间中的专业化? 的相关文章

随机推荐

  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • C# CA2000:使用 FileStream/XmlTextReader 在失去范围之前释放对象

    我有很多这样的代码 FileStream fs File Open C Temp SNB RSS xml FileMode Open using XmlTextReader reader new XmlTextReader fs Some
  • div 在显示内的定位:IE 10 中的表格单元格

    试图理解为什么 IE9 10 会因为 IE7 8 FF WK 都按预期渲染的内容而感到窒息 有什么技巧可以让 IE 9 10 正确尊重 表格单元格 的固有高度 重要提示 由于多种原因 我无法在 单元格 div 上使用 height 100
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 两个 Div 之间的固定宽度间隙

    有谁知道如何修复两个 div 之间的间隙 我有一个主要内容 Div 里面有两个带有图片的 Div 视图的宽度为 768 像素 当我开始拉伸视图时 两张图片开始相互远离 但理想情况下 主要内容 Div 应该在周围有空白的情况下拉伸 并且图片之
  • Angular 2 中的变更检测

    我正在将角度 1 和角度 2 集成在一起 因此我有角度 1 控制器和服务以及角度 2 组件 这些对于数据检索和存储来说工作得很好 反之亦然 下面是我的 html 页面 h3 Angular 1 service h3 div div
  • 错误 com.sap.xs2.security.commons.SAPOfflineTokenServices - 加载 JWT 库时出错

    根据你的Answer https stackoverflow com questions 53343556 invalid bean definition with name offlinetokenservices defined in
  • 如何在报表查看器中添加参数?

    嘿 我在 Visual Studio 2010 中有一个表单应用程序 我想使用报表查看器创建一个报表并添加一些参数 我尝试从代码中添加参数 但没有成功 我有这个错误 tablix Tablix1 的 FilterExpression 表达式
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • 使用 javax.sound.midi 接收 MIDI 输入

    我想要一个程序 当它获得 MIDI 输入时可以做一些事情 例如 当我单击控制器上的按钮 1 时 它应该打印 您单击了 btn 1 当我单击按钮 2 时 它应该打印 您单击了 btn 2 我尝试使用 javax sound midi 库 但论
  • 如何在 64 位中构建 Boost 1.64?

    我运行的是 Windows 10 并在我的笔记本电脑上安装了 Visual Studio 2017 Community Edition 我有一些旧程序在 64 位 Boost 1 62 0 的 VS 2015 中编译得很好 由于一些非常奇怪
  • SWT 表:如何设置/获取“焦点”行

    On Windows and Linux when holding down the Ctrl key one can move up and down using the caret keys without changing the s
  • 使用 Spring AOP 记录方法条目[重复]

    这个问题在这里已经有答案了 任何人都知道如何在跟踪级别使用 Spring AOP 和 log4j 记录方法条目 包括参数值 并退出 它应该能够记录多个包中的类 您可以使用 大约 用于此类目的的方面 Component Aspect Orde
  • 图像处理以提高 tesseract OCR 准确性

    我一直在使用 tesseract 将文档转换为文本 文档的质量参差不齐 我正在寻找有关哪种图像处理可以改善结果的提示 我注意到高度像素化的文本 例如由传真机生成的文本 对于超正方体来说尤其难以处理 大概所有这些字符的锯齿状边缘都会混淆形状识
  • 不使用 BuildContext 预加载图像

    有没有办法在函数中加载 Flutter 中的图像而无需访问 BuildContext Flutter 可以预加载图像precacheImage 需要BuildContext 使用起来不方便 我想加载图像initState StatefulW
  • PhoneGap for Windows Phone - 文件扩展名“.js”没有脚本引擎

    我使用 Microsoft Visual Studio 创建了新项目 但出现编译错误 如下所示 文件扩展名 js 没有脚本引擎 命令 CScript c users raja documents visual studio 2010 Pro
  • 我应该对 ObjectContext 使用 using 关键字吗?

    我在这个网站或 CodeProject 的某个地方读到 好的规则是 如果某个类已经实现了 IDisposable 接口 那么您应该使用 using 关键字 因为使用翻译成 MSIL 的关键字会尝试 最终阻止如下内容 try some log
  • 使用 Libgdx 更新适用于 64 位设备的 Android 应用程序

    我在 Google Play 上有一些 Android 应用程序 我只需要根据谷歌最近提到的以下要求更新应用程序 即 所有应用程序都必须与 64 位兼容 https android developers googleblog com 201
  • 相对文件路径的区别:Qt Creator的调试模式和发布模式

    QFile file test txt if file open QIODevice ReadOnly qDebug lt lt You got me 我在用 Qt 4 8 6 与 MSVC 2010 Qt 创建者 3 1 1 Window
  • 函数模板在另一个类/命名空间中的专业化?

    注意 这个问题与tinyxml只是松散相关 但是包括这样的细节可能有助于更好地说明这个概念 我编写了一个函数模板 它将迭代父 XML 节点子节点 检索子元素的值 然后将该子元素值推送到向量 检索值 部分也写为函数模板 i e templat