在其他 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
我定义的比我的意思多。
我不需要那种类型,但它是我能想到的最简单的例子来说明问题。第二个示例 X
、Y
和 Node
更接近我需要的。另一个类似的例子可能是:using MyList = std::pair<Data, MyList*>
.
我作为示例提出的这些类型是有意义的并且应该能够存在的类型。我可以通过定义自己的结构来定义 V
、Node
、MyList
等,例如:struct V{ V* start; V* end; /*all the other methods here*/ };
... 但是由于 [=21= 中已经定义了很多类型] 以及大量定义明确的语义(构造函数、运算符、迭代器、专用于它们的特征类型等),我不想重新定义相同的类型。
是否可以使用 using 声明创建“递归”(尤其是间接递归,如 Node
或 MyList
示例)类型?
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; };
是否可以在使用前声明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
我定义的比我的意思多。
我不需要那种类型,但它是我能想到的最简单的例子来说明问题。第二个示例 X
、Y
和 Node
更接近我需要的。另一个类似的例子可能是:using MyList = std::pair<Data, MyList*>
.
我作为示例提出的这些类型是有意义的并且应该能够存在的类型。我可以通过定义自己的结构来定义 V
、Node
、MyList
等,例如:struct V{ V* start; V* end; /*all the other methods here*/ };
... 但是由于 [=21= 中已经定义了很多类型] 以及大量定义明确的语义(构造函数、运算符、迭代器、专用于它们的特征类型等),我不想重新定义相同的类型。
是否可以使用 using 声明创建“递归”(尤其是间接递归,如 Node
或 MyList
示例)类型?
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; };