我有一个看起来像这样的类模板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的,而后者又是从其他类型派生的,因此,例如,您可以传递C<SpecialClass<TImpl3>>,并且您的C实现仍已指定(因为SpecialClass的类型为TImpl3)。

10-04 23:01