使用 CRTP 访问的多级静态继承成员
Multilevel static inheritance member accessing with CRTP
我一直在尝试在 C++ 中使用 CRTP 实现多级继承。
但我面临访问超过 2 个级别的成员的问题。
2 级没有问题,我使用的是友元和私有构造函数技术。
当我尝试向层次结构添加另一个级别时遇到问题。
这是我的例子:
template<typename CRTPType>
class State
{
private:
State() = default;
friend CRTPType;
protected:
float value = 0.0f;
}
template<typename CRTPType>
class AnimState : public State<AnimState<CRTPType>>
{
private:
State() = default;
friend CRTPType;
public:
void test() value = 5.0f; //Error, value undeclared
}
class IdleState : AnimState<IdleState>
{
public:
void test() value = 5.0f; //It works, obviously
}
我知道这个问题,IdleState class 将成为 AnimState 和 State 的友元,因此它可以访问两个 class 成员。但我也希望 AnimState 能够访问状态 class 成员。
有什么好的解决办法吗?
提前致谢。
在AnimState
中,value
继承自依赖模板参数的基础。
因此,必须使用 this->value
或 AnimState::value
或 State<...>::value
.
访问它
这可能是因为 value
也可能是全局变量的名称,并且可能存在也可能不存在于父级中,具体取决于模板参数的值,所以为了您的理智,编译器不会不想不得不根据模板参数在全局变量和继承变量之间切换。因此它拒绝在基础 类 中搜索 value
,除非您按照上面的建议对其进行限定。
我一直在尝试在 C++ 中使用 CRTP 实现多级继承。 但我面临访问超过 2 个级别的成员的问题。 2 级没有问题,我使用的是友元和私有构造函数技术。 当我尝试向层次结构添加另一个级别时遇到问题。
这是我的例子:
template<typename CRTPType>
class State
{
private:
State() = default;
friend CRTPType;
protected:
float value = 0.0f;
}
template<typename CRTPType>
class AnimState : public State<AnimState<CRTPType>>
{
private:
State() = default;
friend CRTPType;
public:
void test() value = 5.0f; //Error, value undeclared
}
class IdleState : AnimState<IdleState>
{
public:
void test() value = 5.0f; //It works, obviously
}
我知道这个问题,IdleState class 将成为 AnimState 和 State 的友元,因此它可以访问两个 class 成员。但我也希望 AnimState 能够访问状态 class 成员。
有什么好的解决办法吗?
提前致谢。
在AnimState
中,value
继承自依赖模板参数的基础。
因此,必须使用 this->value
或 AnimState::value
或 State<...>::value
.
这可能是因为 value
也可能是全局变量的名称,并且可能存在也可能不存在于父级中,具体取决于模板参数的值,所以为了您的理智,编译器不会不想不得不根据模板参数在全局变量和继承变量之间切换。因此它拒绝在基础 类 中搜索 value
,除非您按照上面的建议对其进行限定。