你如何使std::变体的使用更"palatable",语法方面?
How do you make the use of std::variants more "palatable", syntax-wise?
这是由我给新手用户的一个答案引起的,我建议他们使用std::variant
而不是联合。
使用联合,您可能具有类似于以下内容的内容:
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
union Value {
Item item;
Boxes boxes;
};
Value contents;
std::string label;
};
(不完全是原始问题的内容,我在这里获得一些诗意的许可。 对于变体,该类可能如下所示:
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
std::variant<Item, Boxes> contents;
std::string label;
};
问题是,有了第一个变体,我可以写
if (box.contents.boxes.size() > 2) { foo(); }
如果我已经确定会有子框,这将起作用。
用一个std::variant
,我必须写:
if (std::get<Boxes>(box.contents).size() > 2) { foo(); }
我觉得第二个版本的可读性要差得多,有点混乱,而且很分散注意力。另外 - 我必须知道boxes
的类型.
在我的代码中,我可以做些什么来使我的用户无需进行这种std::get()
调用,并使他们的生活更加愉快?
只需添加一些包装std::get
s的访问器:
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
std::variant<Item, Boxes> contents;
std::string label;
decltype(auto) item() { return std::get<Item>(contents); }
decltype(auto) item() const { return std::get<Item>(contents); }
decltype(auto) boxes() { return std::get<Boxes>(contents); }
decltype(auto) boxes() const { return std::get<Boxes>(contents); }
};
然后它去:
if (box.boxes().size() > 2) { foo(); }
"访问"方法怎么样?像这样:
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
struct Box {
struct Item { float value; };
using Boxes = std::vector<Box>;
std::variant<Item, Boxes> contents;
std::string label;
decltype(auto) size() const {
return std::visit(overloaded {
[](const Item&) { return 1; }
[](const Boxes& boxes) { return boxes.size(); } // non-recursive
}, *this);
}
};
然后你写:
if (box.size() > 2 ) { foo(); }
?
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- C++语法差异:二维和一维数组(指针算术)
- 你如何使std::变体的使用更"palatable",语法方面?