C++中能否将仅含单个成员的结构体简化为直接使用该成员?
哥们,我完全懂你这种感觉——写个结构体就为了装一个成员,每次调用还要敲个.children确实有点啰嗦!虽然你明确说哪怕不是最佳实践也想知道方法,那我给你几个可行的路子:
继承标准容器(最直接的简化)
你可以让你的node结构体直接继承自std::vector<node*>,这样结构体本身就拥有了vector的所有成员函数,完全不用再通过.children访问:#include <vector> struct node : std::vector<node*> {}; // 用法示例: int main() { node root; root.push_back(new node{}); // 直接调用vector的push_back,不用root.children auto first_child = root[0]; // 直接用下标访问,和vector一样 return 0; }这个方法最贴合你想要的“像用int代替struct N{int n;}”的感觉,相当于把node直接变成了带节点语义的vector。但要注意:这种继承可能会让其他读代码的人困惑——这个类型到底是个容器还是个节点?而且如果以后你想给node加其他成员(比如节点值、父指针),这种继承的写法会变得很别扭。
重载访问运算符(兼顾封装与简洁)
如果你不想放弃结构体的封装感,但又想少敲点代码,可以给结构体重载operator->和operator*,让你能直接“穿透”到children成员:#include <vector> struct node { std::vector<node*> children; // 重载->,返回成员的指针 auto operator->() { return &children; } auto operator->() const { return &children; } // 重载*,返回成员的引用 auto& operator*() { return children; } auto& operator*() const { return &children; } }; // 用法示例: int main() { node root; root->push_back(new node{}); // 用->直接调用vector的方法 (*root).emplace_back(nullptr); // 用*直接访问vector return 0; }这种方法保留了node作为独立结构体的语义,同时简化了访问语法,可读性也比继承好一点,但还是比直接继承多了一点运算符的语法开销。
宏定义(不推荐,但确实能“简化”)
还有个野路子是用宏直接把node替换成std::vector<node*>,但我必须强烈提醒你:宏是预处理阶段的文本替换,很容易引发各种意想不到的问题(比如名字冲突、递归替换出错),而且完全破坏了类型的语义性。代码大概是这样:#include <vector> #define node std::vector<node*> // 但实际编译可能会出问题,因为预处理会把node展开成vector<node*>,递归展开可能导致编译错误真的不建议用这个,除非你是在写一次性的测试代码,否则坑比便利多。
最后多说一句:虽然这些方法能简化代码,但你最初的写法其实是最清晰、最易维护的——它明确告诉所有人“这是一个节点类型,它有子节点列表”。如果只是为了少敲几个字符牺牲可读性,其实有点得不偿失,但如果你就是要图个爽,前面两种方法都能满足你的需求。
内容来源于stack exchange

