专用嵌套模板



我有一个看起来像这样的类模板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<B<...>,C<SpecialClass> >时,所有方法都正常运行,并且对于method1024,都会选择专用方法。

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

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

对于

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

这个呢?

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

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

最新更新