在其他 using 声明中使用它之前声明一个 using 声明

Declaring a using declaration before using it in other using declarations

是否可以在使用前声明using声明?

我想做这样的事情:

using V = std::vector< V >;

或喜欢:

using X, Y; // declaring X and Y
using Node = std::variant< X, Y >;
using X = std::unordered_vector< Node >;
using Y = std::vector< Node >;

可能吗?


编辑:评论集中在V我定义的比我的意思多。

我不需要那种类型,但它是我能想到的最简单的例子来说明问题。第二个示例 XYNode 更接近我需要的。另一个类似的例子可能是:using MyList = std::pair<Data, MyList*>.

我作为示例提出的这些类型是有意义的并且应该能够存在的类型。我可以通过定义自己的结构来定义 VNodeMyList 等,例如:struct V{ V* start; V* end; /*all the other methods here*/ };... 但是由于 [=21= 中已经定义了很多类型] 以及大量定义明确的语义(构造函数、运算符、迭代器、专用于它们的特征类型等),我不想重新定义相同的类型。

是否可以使用 using 声明创建“递归”(尤其是间接递归,如 NodeMyList 示例)类型?

using 不创建新类型。它只为现有类型引入别名。您不能为不存在的类型引入别名,这是您的两个示例都试图做的。

例如,V 作为别名的类型的全名是什么?是 std::vector<std::vector<std::vector<std::vector<...>>>>。那不是一个存在的类型,所以你不能为它创建别名。

using 的方法不起作用,因为这只是为现有类型引入了一个新名称。 using V = std::vector<V>;,即使它被允许,也会导致编译器在尝试确定 V 是什么类型时无限递归。

一种可行的方法是从类型 V 继承 std::vector<V>。 (using vector::vector;vector 构造函数带入 V。)

struct V : std::vector<V> { using vector::vector; };

这打破了递归。 std::vector<V> 有效是因为 V 是它自己的类型。 V 继承 std::vector<V> 的事实与这一点无关。

请注意,当基类未声明虚析构函数时,您不能通过指向基类的指针 delete 类型。这会导致未定义的行为:

std::vector<V> * ptr = new V(); // Permitted, implicit pointer upcast
delete ptr;                     // Undefined behavior

也很容易不小心将基础对象切片,尽管在这种情况下这样做的后果可能并不重要。

同样的方法也适用于您的另一个示例:

class Node;

using X = std::set<Node>;
using Y = std::vector<Node>;

struct Node : std::variant<X, Y> { using variant::variant; };