如何在C++中模拟递归类型定义?

Bil*_*ter 2 c++ design-patterns

昨天我问了以下问题,为方便起见,转载于此;

"对于我的一个项目,我真正想做的就是这样做(将其简化为最低限度);

struct Move
{
    int src;
    int dst;
};

struct MoveTree
{
    Move move;
    std::vector<MoveTree> variation;
};
Run Code Online (Sandbox Code Playgroud)

我必须承认,我认为不可能直接这样做,我认为MoveTree中的MoveTree矢量将被禁止.但无论如何我都试过了,它的效果非常好.我正在使用Microsoft Visual Studio 2010 Express.

这是便携式吗?这是好习惯吗?我有什么值得担心的吗?"

基本上社区的答案是否定的,我不能这样做,标准禁止它,所以它有效的事实意味着我很幸运.

所以我的新问题是.如何在合法的C++中实现我想要的简单功能,而不会增加一堆令人讨厌的复杂性和痛苦?

Cat*_*lus 6

您需要使用指针和动态分配.你应该使用智能指针,以确保你不泄漏任何东西.boost::shared_ptr允许类型不完整,因此这是合法的:

std::vector< boost::shared_ptr<MoveTree> > variation;
Run Code Online (Sandbox Code Playgroud)

(我不知道0x std::shared_ptrTBH,但它应该是相同的).

  • @ MerlynMorgan-Graham:您不能将不完整类型用作标准库容器的模板参数(17.4是"库范围要求"部分).没有语言规则阻止您编写可以处理不完整类型的模板 - 并且`boost :: shared_ptr`明确允许不完整类型 - 请参阅Boost文档. (2认同)