【问题标题】:Specializing nested templates专门化嵌套模板
【发布时间】:2014-11-19 16:25:25
【问题描述】:

我有一个看起来像这样的类模板 A。将 TImpl1 和 TImpl2 视为定义抽象数据类型 B 和 C 的实现以解决属于 A 的问题的参数:

template <typename TImpl1, typename TImpl2, typename TImpl3>
A<B<TImpl1, TImpl2>, C<TImpl3> >

我还有很多非成员函数,它们获取 A 的一个实例,相互调用并对 A 做一些事情。现在我想为我所使用的特定类型的 A 类更改单个方法的规范来介绍一下。

简单的方法:我引入一个空结构“SpecialClass”并进行部分特化:

struct SepcialClass;

// method already existed
template <typename TImpl1, typename TImpl2, typename TImpl3>
method1024(A<B<TImpl1, TImpl2>, C<TImpl3> > a) {
   ...
}

// new method for only some 
template <typename TImpl1, typename TImpl2>
method1024(A<B<TImpl1, TImpl2>, C<SpecialClass> > a) {
   ...
}

因此,每当我声明A&lt;B&lt;...&gt;,C&lt;SpecialClass&gt; &gt; 时,所有方法都会正常运行,并且对于method1024,选择了专门的方法。

这完全可行,但是:我失去了指定 C 实现的可能性。

很遗憾,我无法通过添加第三个参数来重新设计 A。

对于此类问题还有其他想法/解决方法吗?

【问题讨论】:

    标签: c++ templates template-specialization partial-specialization


    【解决方案1】:

    这个呢?

    template <class T>
    struct SpecialClass : T {};
    
    template <class T>
    void method1024(A<B<TImpl1, TImpl2>, C<SpecialClass<T>>> a) {
       ...
    }
    

    此重载专用于任何 SpecialClass,而后者又派生自其他类型,因此您可以传递 C&lt;SpecialClass&lt;TImpl3&gt;&gt;,例如,您的 C 实现仍然被指定(因为 SpecialClass 是 TImpl3 类型)。

    【讨论】:

    • 感谢您的建议。很抱歉,我没有在问题中明确说明 TImpl1、TImpl2 和 TImpl3 是模板参数。由于 TImpl3 有多种选择,我不知道它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多