声明嵌套基础模板 class 实例派生 class 的朋友
Declaring nested base template class instances the friends of a derived class
假设我有:
class A {};
template <typename T> class B {};
template <typename T> class C {};
class D : public C<B<A>> {
//friend ... ??
};
有没有办法为 class D
构造友元声明,使得类型 A
的实例是 D
的友元。 B<A>
类型的实例是 D
的友元。 C<B<A>>
类型的实例是 D
的友元。依此类推,对于任意数量的嵌套模板类型,自动进行,而无需在 D
?
中使用多个友元声明手动指定
编辑:要添加一些上下文,所需的应用程序是使用 "chaining" CRTP 接口的样式,其中 public 函数在实现中调用受保护的 "override" 函数 class,额外的 "friend" 声明有点难看,但我想对于这种风格的复合接口的合理长度来说并不太繁琐。
#include <iostream>
template <typename T>
struct static_base {
T& self() { return static_cast<T&>(*this); }
T const& self() const { return static_cast<T const&>(*this); }
};
template <typename Derived>
class InterfaceBase : public static_base<Derived> {};
template <typename Derived>
class Interface1 : public Derived {
public:
void foo() { this->self().foo_(); }
};
template <typename Derived>
class Interface2 : public Derived {
public:
void bar() { this->self().bar_(); }
};
template <typename Derived>
class Interface3 : public Derived {
public:
void baz() { this->self().baz_(); }
};
class Impl : public Interface3<Interface2<Interface1<InterfaceBase<Impl>>>> {
friend Interface3<Interface2<Interface1<InterfaceBase<Impl>>>>;
friend Interface2<Interface1<InterfaceBase<Impl>>>;
friend Interface1<InterfaceBase<Impl>>;
protected:
void foo_() { std::cout << "foo" << "\n"; }
void bar_() { std::cout << "bar" << "\n"; }
void baz_() { std::cout << "baz" << "\n"; }
};
int main() {
auto impl = Impl();
impl.foo();
impl.bar();
impl.baz();
}
恐怕你们每个 class 都必须加为好友。你不能继承友谊,所以我认为不可能通过一个朋友声明来做到这一点。
假设我有:
class A {};
template <typename T> class B {};
template <typename T> class C {};
class D : public C<B<A>> {
//friend ... ??
};
有没有办法为 class D
构造友元声明,使得类型 A
的实例是 D
的友元。 B<A>
类型的实例是 D
的友元。 C<B<A>>
类型的实例是 D
的友元。依此类推,对于任意数量的嵌套模板类型,自动进行,而无需在 D
?
编辑:要添加一些上下文,所需的应用程序是使用 "chaining" CRTP 接口的样式,其中 public 函数在实现中调用受保护的 "override" 函数 class,额外的 "friend" 声明有点难看,但我想对于这种风格的复合接口的合理长度来说并不太繁琐。
#include <iostream>
template <typename T>
struct static_base {
T& self() { return static_cast<T&>(*this); }
T const& self() const { return static_cast<T const&>(*this); }
};
template <typename Derived>
class InterfaceBase : public static_base<Derived> {};
template <typename Derived>
class Interface1 : public Derived {
public:
void foo() { this->self().foo_(); }
};
template <typename Derived>
class Interface2 : public Derived {
public:
void bar() { this->self().bar_(); }
};
template <typename Derived>
class Interface3 : public Derived {
public:
void baz() { this->self().baz_(); }
};
class Impl : public Interface3<Interface2<Interface1<InterfaceBase<Impl>>>> {
friend Interface3<Interface2<Interface1<InterfaceBase<Impl>>>>;
friend Interface2<Interface1<InterfaceBase<Impl>>>;
friend Interface1<InterfaceBase<Impl>>;
protected:
void foo_() { std::cout << "foo" << "\n"; }
void bar_() { std::cout << "bar" << "\n"; }
void baz_() { std::cout << "baz" << "\n"; }
};
int main() {
auto impl = Impl();
impl.foo();
impl.bar();
impl.baz();
}
恐怕你们每个 class 都必须加为好友。你不能继承友谊,所以我认为不可能通过一个朋友声明来做到这一点。