我想使用 CRTP 实现静态多态性并向模板参数添加其他类型。
提供如下场景,如何直接访问Derived类的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;
/* ... */
};
不过你仍然需要指定一次。
关于c++静态多态性/CRTP,带有访问基类成员的附加模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351536/