问题描述
考虑下面的例子:
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 (将#修改为@)