问题标签 [partial-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 回答
1806 浏览

c++ - 部分模板特化:匹配特化模板参数的属性

有没有办法定义这样的部分专业化,AA<C, B<P1> >将是A正常的模板,但A<C, B<P2> >会是专业化吗?

针对 Marcelo 进行编辑:更具体地说,不应仅使用 B 选择专业化,还应选择具有特定属性的任何类型,例如它是第一个参数为 P2 的模板。

目标是为Y提供一个漂亮的界面A,允许编写类似A<C, Y<P2,Q> >.


用模板模板参数替换Y模板参数会很好,但是有没有办法在此基础上对其进行部分专门化P

目的是编写如下内容:

编辑以回应 In silico:我说制作模板模板参数会很好Y,但实际上这违背了我想要做的目的,即用于Y将逻辑链接的属性组合在一起,但仍然A基于一个那些子属性。


有没有办法通过将特征添加到专业化template <> class B<P2>然后在中使用 SFINAE A?目的是编写如下内容:

0 投票
1 回答
1654 浏览

c++ - 类模板部分专业化的问题

我一直在尝试实现一个需要部分模板专业化并回退到静态结构技术的函数,但我遇到了很多问题。

首先:该结构嵌套在另一个类(提供 Push 作为成员函数的那个​​)中,但它无法访问模板参数(StackSize),即使我的其他嵌套类都可以。我已经解决了这个问题,但如果他们可以像普通类一样访问 StackSize 会更干净。

第二:编译器抱怨它不使用或不能推导出T。真的吗?

第三:编译器抱怨它不能在当前范围(类范围)中专门化一个模板。

我看不出有什么问题。我是否不小心调用了一些错误的语法?

0 投票
2 回答
2137 浏览

c++ - C++:部分模板特化

我没有获得部分模板专业化。我的课看起来像这样:

错误 gcc 输出是:

我尝试了几种解决方案,但都没有奏效。有人对我有提示吗?

0 投票
1 回答
531 浏览

c++ - CPP 模板化成员函数特化

我试图专门化成员函数 moment() (不是洞类),如下所示:

实际的特化发生在一个额外的 abstractWaveletSpecialization 结构中:

问题是我不能在专门的 abstractWaveletSpecialization 结构中调用 momentImpl() :

但是编译器不会抱怨在非专门的 abstractWaveletSpecialization 结构中调用 momentImpl。

我的方法在 C++ 中是否被禁止?或者有什么办法可以使这项工作?

0 投票
1 回答
290 浏览

c++ - 使用 mpl 对现有元函数进行部分特化

也许我今天还不是全部,但我想知道如何让它发挥作用。我想对 boost 库中的 range_mutable_iterator 和 range_const_iterator 进行部分专门化,但仅适用于我宁愿避免明确提及的特定类型,而是仅在 enable_if 测试条件通过时才选择部分专门化。

我目前正在使用 MSVC 2008 并收到以下错误
ArrayType:: template parameter not used or deducible in partial specializationon type

使用 STLFilt,请注意对 T 而不是 ArrayType 的奇怪引用,我猜 STLFilt 是说它无法弄清楚 T == ArrayType..?这是我现在拥有的:

让 range_begin/range_end 工作目前不是问题,目标是让线条看起来像这样:

编辑:在尝试了一种我从这个答案中编辑出来的不同方法之后,我开始接受在这种情况下部分专业化是不可能的,所以我使用了一种不同的方法,涉及完全专业化和大量使用Boost.预处理器。

0 投票
2 回答
466 浏览

c++ - 模板的 C++ 部分特化错误

我正在使用 PC-Lint(用于静态代码分析的出色工具 - 请参阅http://www.gimpel.com/)对于以下代码块:

PC-lint 给了我一个警告:

我相信代码很好,错误就在 lint 方面,但我认为 Lint 工具真的是很棒的工具,而且它更有可能比我不知道的东西。那么这段代码可以吗?

0 投票
1 回答
866 浏览

c++ - std::tuple_element 可以兼作通用模板参数检索器吗?

这个问题让我思考。有时,如果无法定义参数的公共typedef,从类模板特化中获取实际参数很有用。在 C++03 中,这是模板设计不佳或设计意图相反的标志,并不特别常见。但是可变参数模板使 typedef 覆盖变得不可能,所以如果有一个工具来解决这个问题而不需要额外的工作,那就太好了。

C++0x 解决了typedef一个特定可变参数模板的问题,tuple.

但未tuple_element结婚tuple;它也适用于pairand array。它的声明没有提到tuple.

tuple通过部分专业化相关:

但它不需要。模板模板参数可以匹配tuple,以及仅在类型上参数化的任何其他模板。

这将允许

并允许额外的专业化array

不可能发生冲突,因为array' 的第二个参数是 a size_t,而不是类型。


不幸的是,允许用户tuple_element为他们自己的类型专门化接口。用户的先决条件及其保证由 C++0x §17.6.3.2.1/1 给出:

只有当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求并且没有明确禁止时,程序才能将任何标准库模板的模板特化添加到命名空间 std。

因此,一般特化不仅不能与特化冲突array,而且不能与任何命名用户定义类型的特化冲突。也就是说,如果用户声明了一个特化,通用参数 getter 的存在不会影响它是否被选择。

当实例化中出现歧义时(即,两个部分特化匹配一个参数列表),比较备选方案以确定哪个最特化,换句话说,最不通用。调用备选方案 A 和 B。这意味着,如果 A 可以完成 B 的工作,但 B 不能完成 A 的工作,则 B 更专业。A是通才。将选择 B。不考虑引发实例化的实际参数,因为已知它们与两个候选者都匹配。

由于我们希望通用模板遵循其他所有内容,因此我们处于良好状态。

通过用唯一的虚拟类型替换 A 中的部分特化参数来检查通用性,并检查 B 是否也可以实现这样的特化。以相反的角色重复,如果获得相反的结果,则已知一名候选人更专业。

用户特化中用户定义类型的存在保证了它的优先级,因为在参数-getter 中必须有一个与之不匹配的唯一虚拟类型。

例如,这是一个非常通用的用户声明的专业化。它tuple_element为包含给定的任何类型参数化模板定义user_type

序列..., user_type, ...可以由一般情况处理,但用户的情况不能处理完全由人工唯一类型组成的序列,因为它不会包含user_type.

如果任何用户专业化是候选者,它将是更优秀的。

(该标准确实在伪代码中为 指定了一个单独的部分tuple特化,但在 as-if 规则下可以省略它。无论如何,如果实施,它将被相同的优先规则覆盖,以保护用户。)


我没有对部分排序规则进行很多尝试。这个分析正确吗?实现是否可以通过 公开通用模板索引器std::tuple_element

0 投票
2 回答
202 浏览

c++ - 类型定义后需要多个部分特化和完全特化<>

我正在使用一个 C++“事件”类,它允许将一个或两个参数称为委托。

最近我添加了对不需要参数的委托的支持,但是当我将类专门化为不使用模板参数时,我仍然需要在类定义之后添加<> 。

带有一个/两个参数的示例用法:

这里没有参数的例子:

由于它与括号一起使用,我看不出它们应该在那里的理由。这是类专业化代码:

0 投票
2 回答
4714 浏览

c++ - 功能模板的部分专业化

有谁知道在 C++11 中,函数模板是否可以部分专门化?

0 投票
1 回答
415 浏览

c++ - 具有模板作为参数的类的c ++成员函数特化

我正在研究一个模板类 Array,它接受另一个模板 TRAITS 作为参数。

我想根据 Traits::Struct 专门化 Array 的 operator[],但是我被语法困住了。我不确定这是否可能。

编译器(g++ 4.4)抱怨:

编辑。

该解决方案基于 aaa 的提案,如下所示: