作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有可能在 CRTP 中使用内部类或枚举?例如。
template<typename Container>
struct ContainerBase
{
std::map<typename Container::Enum, int> _;
};
struct ConcreteContainer : ContainerBase<ConcreteContainer>
{
enum class Enum
{
left,
right
};
};
最佳答案
没有。在类模板中,派生类尚未完全定义(在standardese 中这不是一个完整的对象)。
In fact (工作草案):
A class is considered a completely-defined object type (or complete type) at the closing
}
因此,您不能期望能够从类模板中访问其中一个成员或您在派生类中声明的任何内容。
您可以通过单独传递枚举来解决它,但它需要您在其他地方定义枚举(另一个基类?外部范围?随便...)。您可以使用特征类来变通。等等。
有几种方法可以做到这一点,但您不能直接访问派生类中定义的枚举。
这是一个可行解决方案的示例:
#include <map>
template<typename> struct traits;
template<typename Container>
struct ContainerBase
{
std::map<typename traits<Container>::Enum, int> _;
};
template<>
struct traits<struct ConcreteContainer> {
enum class Enum
{
left,
right
};
};
struct ConcreteContainer : ContainerBase<ConcreteContainer>
{};
int main() {
ConcreteContainer cc;
cc._[traits<ConcreteContainer>::Enum::left] = 0;
cc._[traits<ConcreteContainer>::Enum::right] = 1;
}
在 wandbox 上查看它的启动和运行情况.
关于c++ - 在 CRTP 中使用内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859050/
我是一名优秀的程序员,十分优秀!