问题标签 [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.

0 投票
4 回答
2291 浏览

c++ - 隐藏函数模板,声明特化

这是C++ 模板的后续:防止基模板的实例化

我使用模板来实现函数重载,而不会出现隐式类型转换的混乱:声明函数模板,定义所需的特化(重载)。一切都很好,除了错误的代码在链接阶段之前不会产生错误:

lib.hpp:

lib.cpp:

主.cpp:

gcc 输出:

我想让它在 main.cpp 的编译过程中失败。我可以以某种方式声明仅实际实施的专业吗?

我有哪些选择?目标是C++03,我主要对gcc-4.x和VC9感兴趣。

0 投票
4 回答
4231 浏览

c++ - 功能模板专业化的重要性和必要性

我读了 C++ Primer,它说函数模板专业化是一个高级主题,但我完全迷失了。谁能提供一个例子,为什么功能模板专业化很重要和必要?

为什么函数模板不支持偏特化,而类模板支持?背后的逻辑是什么?

0 投票
1 回答
625 浏览

c++ - 未使用 CPPUnit 的模板特化

如果您以前使用过 CPPUnit,您可能知道它assertion_traits的模板化处理任意类型的类。这就是它允许它在测试用例失败时打印非字符串类型的“实际”和“预期”值的原因。我已经成功使用过几次了,但是对于一种特定的类型,它对我不起作用。这是我的班级、其父班级和一些非会员运营商的部分声明(整个事情很大,加上我的公司不让我发布):

这是我专门针对 CPPUnit 断言类的尝试:

我已经尝试过按值传递,如上所示,也传递 const 引用,我尝试将函数内的值强制转换为HWDBDateTime(因为这asString()是定义运算符和方法的地方),似乎没有任何帮助。我把它放在了我的测试套件的 CPP 文件的顶部,我把它放到了一个包含项目范围内的 assertion_traits 特化的主头文件中,例如完美运行的 RWCString 的一个。不知何故,每当测试用例失败时,它都会坚持将我的时间打印为浮点值(大概是双精度;CPPUnit 内置了双精度的特化)——这就是为什么我确保包含我的 to/from上面最小化代码中的双重转换运算符。

我正在做的事情本质上是错误的吗?专业化是否需要在编译过程中的某个点出现,也许我只是没有找到那个点?这个神话点是每个翻译单元还是每个项目?我正在使用VS2008。

0 投票
4 回答
15708 浏览

c++ - 模板类成员特化声明

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

这是我要做什么的示例 - 直接来自IBM 关于模板专业化的参考

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

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

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

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

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

===XClass.hpp===

===XClass.cpp===

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

0 投票
2 回答
5349 浏览

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

0 投票
2 回答
5073 浏览

c++ - 模板类的模板构造函数的 C++ 显式模板特化

我有一个像

我想为这样的声明写一个明确的专业化

在下面的测试代码中,如果我注释掉特化,它会用 g++ 编译。否则,它说我的模板参数数量错误:

0 投票
5 回答
2673 浏览

c++ - C++ 模板非类型参数算术

我正在尝试通过以下方式专门化模板:

但是我收到编译器消息错误

我做错了什么?谢谢

我在评论中提出了解决方法。显然我不能在模板专业化中做算术?似乎违反直觉。

这是我要解决的问题的最终解决方案。基本上,连续索引只需要一次乘法。

0 投票
4 回答
2052 浏览

c++ - 具有共享功能的类模板特化

我正在编写一个带有模板向量类型的简单数学库:

现在我想要一些专门针对其中一些的附加功能。假设我想要函数x()y()访问Vector<T, 2>特定的坐标。我可以为此创建一个部分专业化:

但现在我要重复通用模板中已经存在的所有内容。

我也可以使用继承。将通用模板重命名为VectorBase,我可以这样做:

但是,现在的问题是所有运算符都定义在 上VectorBase,因此它们返回VectorBase实例。这些不能分配给Vector变量:

我可以提供Vector一个隐式转换构造函数来实现这一点:

但是,现在我又来回转换了VectorVectorBase尽管内存中的类型相同,并且编译器可能会优化所有这些,但感觉很笨重,而且我真的不喜欢对本质上是编译时问题的潜在运行时开销。

有没有其他方法可以解决这个问题?

0 投票
1 回答
86 浏览

c++ - 模板定义中的模板特化:所有编译器或标准用法都支持吗?

这是在 VS 2008 上编译的,但它似乎是模板的非标准用法。

Foo<int>由于模板专业化包含在其自己的模板类的定义中,是否存在问题?

0 投票
1 回答
303 浏览

c++ - C++ 创建通用模板函数特化

我知道如何专门化一个模板函数,但是我想在这里做的是专门为所有具有给定方法的类型的函数,例如:

我的类中的 T::bar 是静态的,并且具有不同的返回类型。

我尝试通过为我的类派生一个空的基类(“class HasBar{};”)并在我的“专业”版本上使用 boost::enable_if 和 boost::is_base_of 来做到这一点。然而问题在于,对于确实有 bar 的类,编译器无法解析使用哪一个 :(。

我知道我可以在“普通”版本上使用 boost::disable_if ,但是我不控制普通版本(它由第三方库提供,并且它期望进行专业化,我只是不想为我的 20 个左右的类进行明确的专业化),我也没有太多控制使用这些函数的代码,只有实现 T::bar 的类和使用它的函数。

有没有办法告诉编译器“无论如何都尽可能使用这个版本”而不改变其他版本?

编辑:我尝试了使用模板类和显式专业化的不同方法,但这显然也是不允许的......无论如何要使这种方法起作用?