我有一个操作和(共享)信息类的层次结构,直观地看起来似乎不需要运行时多态性,但是没有它我找不到解决方案.
为了这个问题,假设有一个2级层次结构.存在基本操作和派生操作.来自层次结构的同一级别的对象可能需要在它们之间共享信息(意味着基本操作对象需要共享基本信息,派生操作对象需要共享派生信息,但基本操作对象永远不需要共享派生信息或副本反之亦然).
所以它从这样开始:
// Shared between base operation objects
class base_info
{
};
// Shared between derived operation objects
class derived_info :
public base_info
{
};
Run Code Online (Sandbox Code Playgroud)
鉴于没有关于哪些操作对象共享哪些信息对象的运行时问题,还有以下内容:
template<class Info>
class base_op
{
std::shared_ptr<Info> m_info;
};
class derived_op :
public base_op<derived_info>
{
};
Run Code Online (Sandbox Code Playgroud)
代码的其余部分始终实例base_op有base_information,所以不需要运行polymporphism了这里.
现在,在某些时候,共享信息对象可以决定是否需要生成新操作.如上所示,操作对象需要共享信息对象的共享指针.所以信息层次结构改变为:
// Shared between base operation objects
class base_info :
private std::enable_shared_from_this<base_info>
{
void do_something_spawning_new_ops();
};
...
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何实施do_something_spawning_new_ops.使用运行时多态性,并不困难:
class base_info :
private std::enable_shared_from_this<base_info>
{
void do_something_spawning_new_ops()
{
// Need a new op.
get_op_shared_ptr();
}
virtual std::shared_ptr<base_op> get_op_shared_ptr()
{
// use shared_from_this, create a base_op object using it.
}
};
class derived_info :
public base_info
{
virtual std::shared_ptr<base_op> get_op_shared_ptr()
{
// use shared_from_this + std::*_pointer_cast,
// create a derived_op object
}
};
Run Code Online (Sandbox Code Playgroud)
但关键是要避免运行时多态性,因为通过设计,一切都可以在实例化时知道.所以回到帖子的开头,有这样的事情会很好:
template<class Op>
class base_info
{
};
class derived_info :
public base_info<derived_op>
{
};
Run Code Online (Sandbox Code Playgroud)
使用CRTP类型的东西(尽管没有推导),其中op表示它包含创建此类型对象的信息.但这现在导致了实例化的循环问题base_op.它以某种方式需要通过某种信息类型来实例化,这种信息类型本身就是由它自己的类型等实例化的.我不知道如何制动这种类型循环.
编辑
按照Panta rhei的建议,这是我的目标代码.
我仍然不太确定您想要实现什么,但是要使代码编译,您所需要做的就是在 main 中实例化它时在 base_info 类模板中添加一个类型参数。
int main()
{
derived_op d;
base_op<base_info<derived_info> > b;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |