使用必须知道其容器的对象.希望避免恼人的代码重复

Using objects which must be aware of their container. Want to avoid annoying code repeats

本文关键字:希望 代码 对象      更新时间:2023-10-16

我有一棵树。它提供空间分区服务(不只是BSP)。树中的每个节点都可以拥有(通过unique_ptr)多态对象。这些对象需要知道它们被分配到哪个节点。因此,在为节点创建对象时,必须将节点引用传递给构造函数。

node.data.reset(new t_Something(node));

通常我需要创建(并分配给相应的节点)多个对象,而不仅仅是一个。

node_a.data.reset(new t_Wing(node_a, /*wing args*/...));
node_h.data.reset(new t_Hall(node_h, /*hall args*/...));
node_b.data.reset(new t_Wing(node_b, /*wing args*/...));

我正在开发内容生成器,将来我会写很多这样的代码。我想避免在node_XXX.data.reset(new T(node_XXXX中重复node_XXX

模板:

#include <utility>    // for std::forward
template <typename T, typename N, typename ...Args>
N & add(N & node, Args &&... args)
{
    node.data.reset(new T(node, std::forward<Args>(args)...));
    return node;
}

用法:

add<t_Wing>(node_a);                // appends new t_Wing(node_a)
add<x_Wing>(node_b, arg1, arg2);    // appends new x_Wing(node_b, arg1, arg2)

拥有调用data.reset本身的构造函数,您已经传递了节点参数。