我有一个类模板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.
这类问题还有其他想法/解决方法吗?
答案 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) )。