模板类成员特化声明

2024-01-19

当我在模板类中专门化一个(静态)成员函数/常量时,我​​对声明的去向感到困惑。

这是我要做什么的一个例子 - 直接来自IBM 关于模板专业化的参考 http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/topic/com.ibm.xlcpp8a.doc/language/ref/explicit_specialization.htm#explicit_specialization:

===IBM 会员专业化示例===

template<class T> class X {
public:
   static T v;
   static void f(T);
};

template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }

template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }

int main() {
   X<char*> a, b;
   X<float> c;
   c.f(10); // X<float>::v now set to 20
}

问题是,如何将其分为头文件/cpp 文件?通用实现显然在标头中,但是专业化呢?

它不能放在头文件中,因为它是具体的,导致多个定义。但是,如果它进入 .cpp 文件,调用 X::f() 的代码是否知道专门化,或者它可能依赖于通用 X::f() ?

到目前为止,我仅在 .cpp 中进行了专门化,标头中没有声明。我在编译甚至运行我的代码时都没有遇到问题(在 gcc 上,目前不记得版本),并且它的行为符合预期 - 识别专业化。但是 A) 我不确定这是正确的,我想知道正确的是什么,B) 我的 Doxygen 文档很不稳定并且非常具有误导性(稍后将在 a moment 中详细介绍)问题)。

对我来说最自然的是这样的,在标头中声明专业化并在 .cpp 中定义它:

===XClass.hpp===

#ifndef XCLASS_HPP
#define XCLASS_HPP

template<class T> class X {
public:
   static T v;
   static void f(T);
};

template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }

/* declaration of specialized functions */
template<> char* X<char*>::v;
template<> void X<float>::f(float arg);

#endif

===XClass.cpp===

#include <XClass.hpp>

/* concrete implementation of specialized functions */
template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }

……但我不知道这是否正确。有任何想法吗?


通常你只需定义专业inline在标题中,如 dirkgently 所说。

如果您担心编译时间或代码膨胀,您可以在单独的翻译单元中定义专业化:

// x.h:
template<class T> struct X {
    void f() {}
}

// declare specialization X<int>::f() to exist somewhere: 
template<> void X<int>::f();

// translation unit with definition for X<int>::f():
#include "x.h"
template<> void X<int>::f() {
    // ...
}

所以是的,你的方法看起来不错。请注意,您只能使用完整的专业化,因此这样做通常是不切实际的。

有关详细信息,请参见例如科莫斯模板常见问题解答 http://www.comeaucomputing.com/techtalk/templates/#export.

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

模板类成员特化声明 的相关文章

  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 与 Qt 项目的静态链接

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

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 新任务中使用的依赖注入服务

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

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐

  • 在Python中向上移动一个目录

    有没有一种简单的方法可以使用一行代码在 python 中上移一个目录 类似的东西cd 在命令行中 gt gt gt import os gt gt gt print os path abspath os curdir C Python27
  • 运行 play 框架时不支持 Major.minor 版本 51.0

    我知道存在版本冲突 只是希望有人告诉我如何解决它 在之前的 stackoverflow 帖子中 没有人告诉我们解决方案 版本 Ubuntu 12 04 1 LTS java 1 6 0 24 OpenJDK javac 1 7 0 07 O
  • R 中用于大型复杂调查数据集的方法?

    我不是调查方法学家或人口统计学家 但我是 Thomas Lumley 的 R 调查包的狂热粉丝 我一直在处理一个相对较大的复杂调查数据集 即医疗保健成本和利用项目 HCUP 国家急诊室样本 NEDS https www hcup us ah
  • Gboard 贴纸搜索未返回结果

    通过应用程序索引 我将贴纸包添加到 GBoard 但 GBoard 搜索无法按关键字找到我的贴纸 new Indexable Builder Sticker setName Bye setImage http www snoopystick
  • 如何在 Swift 中获取前置摄像头?

    我正在尝试让前置摄像头具有实时取景功能 我可以使用以下方式获取后置摄像头 var backCamera AVCaptureDevice defaultDeviceWithMediaType AVMediaTypeVideo 但我似乎找不到如
  • Stripe 在特定日期取消订阅

    我在用着条纹API https stripe com docs api在 PHP 中 我不知道如何在特定日期停止客户订阅 我知道有一个立即取消订阅的选项 subscription Stripe Subscription retrieve s
  • 使用 Lucene Search 一次搜索多个索引

    我正在使用 Zend Search Lucene 来实现站点搜索 我为不同的数据类型创建了单独的索引 例如 一个用于用户 一个用于帖子等 结果类似地按数据类型划分 但有一个 全部 选项应显示不同结果类型的组合 是否可以同时搜索不同的索引 或
  • 如何在 C# 中引用另一个项目?

    我在我的解决方案中添加了一个项目 Project2 它已经有另一个项目 比如说项目 1 我如何将项目 2 中的类和方法调用到项目 1 中 我做了什么 我有项目 1 及其解决方案 我将项目 2 添加到项目 1 的解决方案中 项目 1 和项目
  • Java 8 DateTimeFormatters 常量在哪里定义?

    我正在看DateTimeFormatter https docs oracle com javase 8 docs api java time format DateTimeFormatter html类 我想知道常量在哪里 M EEE a
  • 包含或异或有什么区别?

    我一直在研究一些业务流程执行语言 BPEL 和相关的建模系统 BPMN 其中设计人员需要了解流程流的包容性和排他性网关 非常感谢您的帮助 假设适用相同的规则 对术语的一般解释就足够了 这是我试图理解的一些技术文本对马克的回应 对于连接两个活
  • 是否在数据库级别或服务器/实例级别启用了“CLR 集成”?

    我试图了解启用 CLR 是否在数据库级别或服务器级别 实例级别启用它 在线书籍根本不清楚 如果我使用此命令启用 CLR 会发生什么 它会在所有服务器上启用吗 sp configure clr enabled 1 GO RECONFIGURE
  • “结合更牢固”这句话是什么意思?

    我知道这可能是一个新手问题 但我试图理解这句话 来自一篇关于使用 EBNF 的元语言的论文 Logical and binds stronger than logical or 在此之前它说 Conditions are condition
  • 无法从 master 连接到 kubernetes pod:i/o 超时

    我配置了 1 个主节点和一个节点的 kubernetes 集群 运行主节点和节点的机器不在同一网络中 对于网络 我安装了 calico 并且所有 pod 都在运行 为了测试我使用的集群获取外壳示例 https kubernetes io d
  • 用 Java 写入文件

    我对 Java 很陌生 由于某种原因我无法写入文件 我的代码如下所示 FileWriter fstream try fstream new FileWriter fileLocation BufferedWriter out new Buf
  • 如何定期更新 Label 控件的值?

    我试图让标签显示一些文本 然后在一段时间后刷新自身并能够稍后重新显示其他内容 但目前我不知道如何使标签暂停 如果可能的话 到目前为止我的代码 foreach var x in mod labelWARNING Visible true la
  • 全屏纹理采样的最佳方式

    在片段着色器中采样全屏纹理的最佳方法是什么 例如延迟渲染器中的 g 缓冲区 或后处理着色器中的场景纹理 目前我使用以下两种方式 将屏幕尺寸作为统一值传递给着色器并计算 u v gl FragCoord vec2 texCoord gl Fr
  • 在 .each 循环中显示一个条目的模式 - Rails / Bootstrap

    我想要一个链接来打开一个模式 显示单击的对象 word title 显示在每个循环中 现在它会打开模式 但随后会为循环中的每个项目再次显示它 h1 Glossary of words h1 p Pagination at 25 p tabl
  • 如何将 CSV 或 JSON 导入到 firebase cloud firestore

    有没有办法像 Firebase 实时数据库一样将 CSV 或 JSON 导入到 firebase cloud firestore 通用解决方案 我发现许多脚本允许上传 JSON 但没有一个允许子集合 我上面的脚本处理任何级别的嵌套和子集合
  • 如何使用XNA加载文件夹中的所有文件?

    我想加载文件夹中的所有文件 内容 纹理 进入游戏使用Content Load 文件名 但是 我无法以这种方式 找到 位于 Content 内的文件 该程序而是查看 bin 调试 内容 纹理 但是当尝试使用 Content Load 加载 j
  • 模板类成员特化声明

    当我在模板类中专门化一个 静态 成员函数 常量时 我 对声明的去向感到困惑 这是我要做什么的一个例子 直接来自IBM 关于模板专业化的参考 http publib boulder ibm com infocenter comphelp v8