专门嵌套模板

时间:2014-11-19 16:25:26

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

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

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

我还有很多非成员函数可以获得A的实例,相互调用并用A做一些事情。现在我想改变一个特定类型的A类的单一方法的规范。 #39;我要介绍。

简单方法:我介绍一个空结构&#34; SpecialClass&#34;并做部分专业化:

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<B<...>,C<SpecialClass> >时,所有方法都正常运行,而方法1024则选择专门的方法。

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

不幸的是,我不能通过添加第三个参数来重新设计A.

这类问题还有其他想法/解决方法吗?

1 个答案:

答案 0 :(得分:0)

这个怎么样?

template <class T>
struct SpecialClass : T {};

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

此重载专用于任何SpecialClass,而后者又派生自其他类型,因此您可以传递C<SpecialClass<TImpl3>>,并且仍然指定了您的C实现(因为SpecialClass的类型为TImpl3) )。