在以下代码中:
template <typename U, typename V> class A {};
template <typename U, typename V> class B {};
template <typename T>
class C {
template <typename U, typename V> friend class A; // Works fine.
// template <typename U> friend class B<U,T>; // Won't compile.
};
我希望B<U,T>
成为C<T>
的朋友,也就是说,B的第二个参数必须与C&C的参数匹配,尽管它的第一个参数可以是任何参数。我该如何实现这一目标?朋友对A<U,V>
的声明太多了,但如果我不能进一步限制它,我会接受它。
也许定义一个元函数
template <typename, typename = void> struct FriendTraits { struct type{}; };
或C中的类似内容?
前两行
template <typename, typename = void> struct FriendTraits { struct type{}; };
template <typename U> struct FriendTraits<U,T> { using type = B<U,T> ; } ;
template <typename U> friend typename FriendTraits<U,T>::type;
编译,但不是重要的第3行(因为它是同样的问题)。