crtp父级对姐妹类的访问
crtp parent access to sister class
我有一个名为base的类。这个类是不可访问的(我指的是源代码),因为它是第三方类。这个类有一个方法,我想从(父)姐妹(比如说叔叔)类访问它。
class base {
public:
void do_something() {
std::cout << "base1::do_something" << std::endl;
}
};
我有另一个父类,它是通过使用crtp访问子类的成员而创建的:
template<typename crtpT>
class crtp {
public:
void foo() {
std::cout << "crtp::foo" << std::endl;
static_cast<crtpT*>(this)->bar();
//static_cast<crtpT::base_type*>(this)->do_something();
// how do i access base::bar
}
};
最后,一个从两者继承的子类:
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
};
main.cpp:
int main(int argc, char* argv[]) {
child<base> ch;
ch.do_something();
ch.foo();
ch.bar();
return 0;
}
现在我的问题是,我需要从crtp-类访问do_something
。这可能吗?
静态广播不起作用。我认为在生成crtp类时,编译器对基类一无所知。crtp类必须是类子类的父类,因为许多其他类都是从它派生的。否则,我可能会使用对姐妹类的委托。
编辑:
我可以在我的孩子内部做第二个bar方法,但这不是很好,因为我必须为基类中的所有方法编写包装器。
template<typename baseT>
class child : public baseT, public crtp<child<baseT> > {
public:
typedef baseT base_type;
void bar() {
std::cout << "child::bar" << std::endl;
}
void bar2() {
base_type::do_something();
}
};
并呼叫:
static_cast<crtpT*>(this)->bar2();
static_cast
:[expr.static.cast]/11
类型为"pointer to cv1 B"的prvalue,其中B是类类型,可以转换为类型为"pointer to cv2 D"的prvalue,其中D是从B[…]派生的类
因此,您需要将crtp<...>*
转换为子类child*
,然后甚至可以使用隐式转换为base
,例如
crtpT::base_type* p = static_cast<crtpT*>(this);
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- 访问C++中姐妹对象的成员变量
- crtp父级对姐妹类的访问
- 访问姐妹类的实例