我想公开从一个模板派生一个类,使它继承自一个基类并获得对受保护成员的访问。但在模板被展开之前,它没有这些权限,因此它不能将一个Base成员用作模板参数:
using Fun = void (*)();
class Base {
protected:
// friend class Derived; // ...need this to eliminate complaint
static void something();
};
template<Fun F>
class Variant : public Base {};
class Derived : public Variant<&Base::something> { // `something()` is protected
public:
void somethingElse() {
something(); // doesn't complain about this `something()`
}
};
int main() {}
对我来说,这个问题的奇怪之处在于添加友元居然起作用。我想知道是否可以通过在 Variant 前从 Base 进行公共虚拟继承来“偷偷摸摸地将 Derived 引入其中”:
class Derived : public virtual Base, public Variant<&Base::something>
那没有帮助。
问题:有没有其他技巧可以避免在Base中显式提及所有派生类,但仍然可以访问它的受保护成员以供模板参数使用?
(注意:在旧版gcc 4.6.3上尝试这一点,看起来即使是友元也无济于事。因此,支持这一点似乎是相对较新的。)