我有一个看起来像这样的类模板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)。