问题标签 [template-specialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 隐藏函数模板,声明特化
我使用模板来实现函数重载,而不会出现隐式类型转换的混乱:声明函数模板,定义所需的特化(重载)。一切都很好,除了错误的代码在链接阶段之前不会产生错误:
lib.hpp:
lib.cpp:
主.cpp:
gcc 输出:
我想让它在 main.cpp 的编译过程中失败。我可以以某种方式声明仅实际实施的专业吗?
我有哪些选择?目标是C++03,我主要对gcc-4.x和VC9感兴趣。
c++ - 功能模板专业化的重要性和必要性
我读了 C++ Primer,它说函数模板专业化是一个高级主题,但我完全迷失了。谁能提供一个例子,为什么功能模板专业化很重要和必要?
为什么函数模板不支持偏特化,而类模板支持?背后的逻辑是什么?
c++ - 未使用 CPPUnit 的模板特化
如果您以前使用过 CPPUnit,您可能知道它assertion_traits
的模板化处理任意类型的类。这就是它允许它在测试用例失败时打印非字符串类型的“实际”和“预期”值的原因。我已经成功使用过几次了,但是对于一种特定的类型,它对我不起作用。这是我的班级、其父班级和一些非会员运营商的部分声明(整个事情很大,加上我的公司不让我发布):
这是我专门针对 CPPUnit 断言类的尝试:
我已经尝试过按值传递,如上所示,也传递 const 引用,我尝试将函数内的值强制转换为HWDBDateTime
(因为这asString()
是定义运算符和方法的地方),似乎没有任何帮助。我把它放在了我的测试套件的 CPP 文件的顶部,我把它放到了一个包含项目范围内的 assertion_traits 特化的主头文件中,例如完美运行的 RWCString 的一个。不知何故,每当测试用例失败时,它都会坚持将我的时间打印为浮点值(大概是双精度;CPPUnit 内置了双精度的特化)——这就是为什么我确保包含我的 to/from上面最小化代码中的双重转换运算符。
我正在做的事情本质上是错误的吗?专业化是否需要在编译过程中的某个点出现,也许我只是没有找到那个点?这个神话点是每个翻译单元还是每个项目?我正在使用VS2008。
c++ - 模板类成员特化声明
当我在模板类中专门化一个(静态)成员函数/常量时,我对声明的去向感到困惑。
这是我要做什么的示例 - 直接来自IBM 关于模板专业化的参考:
===IBM 会员专业化示例===
问题是,如何将其划分为 header/cpp 文件?通用实现显然在标题中,但专业化呢?
它不能放在头文件中,因为它是具体的,导致多重定义。但是,如果它进入 .cpp 文件,调用 X::f() 的代码是否知道特化,或者它可能依赖于通用 X::f()?
到目前为止,我只在 .cpp 中获得了专业化,在标题中没有声明。我在编译甚至运行我的代码时都没有遇到问题(在 gcc 上,目前不记得版本),并且它的行为符合预期 - 识别专业化。但是 A)我不确定这是正确的,我想知道是什么,并且 B)我的 Doxygen 文档出现问题并且非常具有误导性(稍后会详细介绍)。
对我来说最自然的事情是这样的,在标头中声明专业化并在 .cpp 中定义它:
===XClass.hpp===
===XClass.cpp===
...但我不知道这是否正确。有任何想法吗?
doxygen - Doxygen 用于 C++ 模板类成员特化
当我编写类模板并且需要完全特化这些类的成员时,Doxygen 无法识别特化——它只记录泛型定义,或者(如果只有特化)最后一个定义。这是一个简单的例子:
===MyClass.hpp===
=== MyClass.cpp ===
因此,在这种情况下,foo() 将被记录为打印“Generic foo”,INT_CONST 将被记录为设置为 5,没有提及专业化,而 TTYPE_CONST 将被记录为设置为“a”,没有提及3.141 并且没有表明“a”是特殊情况。
我需要能够记录专业化 - 无论是在文档中MyClass<T>
,还是在新页面上MyClass<double>
,MyClass<char>
。我该怎么做呢?Doxygen 甚至可以处理这个问题吗?我可能在声明/代码结构中做错了什么,使 Doxygen 无法理解我想要的东西吗?
我应该注意两个相关的案例:
A) 对于模板化函数,专业化工作正常,例如:
这将同时记录foo<T>()
和foo<double>()
。
B)如果我重新声明整个模板,即template<> class MyClass<double>{...};
,那么MyClass<double>
将获得它自己的文档页面,作为一个单独的类。但这意味着实际上声明了一个全新的类——如果声明了自身MyClass<T>
,则两者之间没有关系。所以我必须重新声明这个类和它的所有成员,并重复所有类成员的定义,专门为,所有这些都让它看起来好像它们使用的是相同的模板。非常尴尬,感觉就像一个杂乱无章的解决方案。MyClass<double>
MyClass<double>
MyClass<double>
建议?非常感谢 :)
--Ziv
c++ - 模板类的模板构造函数的 C++ 显式模板特化
我有一个像
我想为这样的声明写一个明确的专业化
在下面的测试代码中,如果我注释掉特化,它会用 g++ 编译。否则,它说我的模板参数数量错误:
c++ - C++ 模板非类型参数算术
我正在尝试通过以下方式专门化模板:
但是我收到编译器消息错误
我做错了什么?谢谢
我在评论中提出了解决方法。显然我不能在模板专业化中做算术?似乎违反直觉。
这是我要解决的问题的最终解决方案。基本上,连续索引只需要一次乘法。
c++ - 具有共享功能的类模板特化
我正在编写一个带有模板向量类型的简单数学库:
现在我想要一些专门针对其中一些的附加功能。假设我想要函数x()
并y()
访问Vector<T, 2>
特定的坐标。我可以为此创建一个部分专业化:
但现在我要重复通用模板中已经存在的所有内容。
我也可以使用继承。将通用模板重命名为VectorBase
,我可以这样做:
但是,现在的问题是所有运算符都定义在 上VectorBase
,因此它们返回VectorBase
实例。这些不能分配给Vector
变量:
我可以提供Vector
一个隐式转换构造函数来实现这一点:
但是,现在我又来回转换了Vector
。VectorBase
尽管内存中的类型相同,并且编译器可能会优化所有这些,但感觉很笨重,而且我真的不喜欢对本质上是编译时问题的潜在运行时开销。
有没有其他方法可以解决这个问题?
c++ - 模板定义中的模板特化:所有编译器或标准用法都支持吗?
这是在 VS 2008 上编译的,但它似乎是模板的非标准用法。
Foo<int>
由于模板专业化包含在其自己的模板类的定义中,是否存在问题?
c++ - C++ 创建通用模板函数特化
我知道如何专门化一个模板函数,但是我想在这里做的是专门为所有具有给定方法的类型的函数,例如:
我的类中的 T::bar 是静态的,并且具有不同的返回类型。
我尝试通过为我的类派生一个空的基类(“class HasBar{};”)并在我的“专业”版本上使用 boost::enable_if 和 boost::is_base_of 来做到这一点。然而问题在于,对于确实有 bar 的类,编译器无法解析使用哪一个 :(。
我知道我可以在“普通”版本上使用 boost::disable_if ,但是我不控制普通版本(它由第三方库提供,并且它期望进行专业化,我只是不想为我的 20 个左右的类进行明确的专业化),我也没有太多控制使用这些函数的代码,只有实现 T::bar 的类和使用它的函数。
有没有办法告诉编译器“无论如何都尽可能使用这个版本”而不改变其他版本?
编辑:我尝试了使用模板类和显式专业化的不同方法,但这显然也是不允许的......无论如何要使这种方法起作用?