[英]c++ static polymorphism / CRTP with additional template parameters accessing base class member
我想使用CRTP实现静态多态性,并且还向模板参数添加其他类型。
提供以下方案,如何直接从派生类访问基本成员? 是否可以不指定Base类的完整类型?
#include <iostream>
template<class Derived, class X>
struct Base
{
void set_a( int a ) { _a = a; }
protected:
int _a;
};
template<class X>
struct Derived: public Base<Derived<X>, X>
{
int get_a( )
{
// return Base<Derived<X>,X>::_a; // This works!
return _a; // error: use of undeclared identifier '_a'
}
};
struct foo;
int main()
{
Derived<foo> test;
auto base_p = static_cast< Base<Derived<foo>, foo>* >( &test );
base_p->set_a( 42 );
int a = test.get_a();
std::cout << a << std::endl;
}
g ++ 5.3.1 / clang ++ 3.8.0输出:
error: use of undeclared identifier '_a'
您可以在类中添加using
声明:
template<class X>
struct Derived: public Base<Derived<X>, X> {
using Base<Derived<X>, X>::_a;
/* ... */
};
您仍然必须指定一次。
在Derived
范围中,不是声明_a
而是继承了_a
,因此您必须编写_a
this->_a
来在基类中查找,或显式编写Base<Derived<X>, X>::_a
。 后者可以与
using Base<Derived<X>, X>::_a;
在Derived
的定义中。
tl; dr
如果this->_a
写, this
是自动向上转换到Base<Derived<X>, X>*
相匹配的内在operator->
。
如果仅写入_a
,则将执行不合格的名称查找 。 不合格的名称查找是基于范围的,这与继承无关。 在您的示例中, _a
在Derived::get_a
,因此在_a
中搜索
Derived::get_a
Derived
未找到_a
,这将触发编译错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.