如何告诉派生类使用哪个受保护的基类成员

问题描述

考虑下面的例子:

class Base {
protected:
    struct SubStruct { double value; };
};

class Derived : public Base {
public:
    Derived() {
        data.value = 3.14;
    }
    Base::SubStruct data;
};


int main()
{
    Derived instance;
    std::cout << instance.data.value << std::endl;

    return 0;
}

Derived 类具有在其基类中定义的类型的 data 成员。请特别注意 SubStruct 类型在 Base 中受到保护。

现在我通过选择子结构来增强 Base。为了选择要使用的子结构,我正在制作 Derived 模板:

class Base {
protected:
    struct SubStructInt { int value; };
    struct SubStructDouble { double value; };
};

template<typename S>
struct Derived : public Base {
    Derived() {
        data.value = 3.14;
    }
    S data;
};


int main()
{
    Derived<Base::SubStructInt> instanceInt;
    std::cout << instanceInt.data.value << std::endl;
    Derived<Base::SubStructDouble> instanceDouble;
    std::cout << instanceDouble.data.value << std::endl;

    return 0;
}

这不会编译,因为子结构是受保护的,而且我无法使用 Derived 中受保护的类型实例化 Base(如果我将它们公开,则一切正常)。

我不想公开子结构,所以我用 std::conditional 找到了一个解决方案:

template<bool flag>
struct Derived : public Base {
    using SubStruct = std::conditional_t<flag,SubStructInt,SubStructDouble>;

    Derived() {
        data.value = 3.14;
    }
    SubStruct data;
};

无论如何,我认为这不是问题的最佳/惯用解决方案:“如何对派生类说要使用基类的哪个保护类型”。归根结底,受保护的子类型在 Derived 中可见,并且可以从那里取别名:

template<typename S>
struct Derived : public Base {
    using DerivedInt = Derived<SubStructInt>;
    using DerivedDouble = Derived<SubStructDouble>;

    // ...    
};

有更好的方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)