【发布时间】:2010-05-29 06:13:04
【问题描述】:
template <typename X, typename Y> class A {
// Use Y::Q, a useful property, not used for specialization.
};
enum Property {P1,P2};
template <Property P> class B {};
class C {};
有没有办法定义A 的部分特化,使A<C, B<P1> > 成为A 的普通模板,但A<C, B<P2> > 是特化?
针对 Marcelo 进行编辑:更具体地说,不仅应该选择 B,还应该选择任何表现出特定属性的类型,例如它是第一个参数是 P2 的模板.
目标是使用Y 为A 提供一个漂亮的界面,允许编写类似A<C, Y<P2,Q> > 的内容。
用模板模板参数替换Y 模板参数会很好,但是有没有办法基于P 部分专门化它呢?
本意是这样写:
template <typename X, template <Property P> typename Y> class A {};
template <typename X> class A<X,template<> Y<P2> > {}; // <-- not valid
编辑以响应 In silico:我说将 Y 设为模板模板参数会很好,但实际上这违背了我想要做的目的,即使用Y 将逻辑链接的属性组合在一起,但仍基于这些子属性之一专门化 A。
有没有办法通过将特征添加到专业化 template <> class B<P2> 然后在 A 中使用 SFINAE?目的是写如下内容:
template <> class B<P2> {
typedef int IAmP2;
};
// The following is not valid because it's a simple redefinition.
template <typename X, typename Y> class A {
// Substitution using this template would fail for Y<P1>, and only the
// general template would be left for selection.
typename Y::IAmP2 skipIfNotP2;
};
【问题讨论】:
-
你想具体做什么?可能有可能实现你想要的,但我不太明白你的问题。
X和Y在您的预期应用程序中代表什么? -
顺便说一下,SFINAE 仅适用于函数重载,不适用于模板特化。
-
假设您有 Matrix
,并且您希望能够执行类似 Matrix > 或 Matrix > 之类的操作,但是需要针对所有密集存储方案的专用矩阵版本。 -
我明白了,我不知道 SFINAE 仅适用于函数重载,谢谢。
-
这不是真的。 SFINAE 适用于任何演绎上下文,也涵盖部分模板特化。
标签: c++ sfinae partial-specialization template-templates