c++ - 标准空参数类型的功能类似于 void
问题描述
标准中是否有类似功能的类型void
?即实际上从参数列表中省略的东西,比如标签式结构?
void foo(){}
void foo(std::empty_type){}
// assembly for these two should be the same, no arguments
我的用例:我正在编写自己的基于范围的for
迭代器对象。问题是返回的对象足以检查它是否在末尾(我正在包装一个 API)。这种基于范围的方法for
受到了很大的影响,任何小的优化都会对代码性能产生巨大的提升。问题是,我不能声明一元operator !=
,也不能按照标准声明类型符号void
,所以我想用大小为 0 的对象来模拟它。
我可以使用什么类型来提示编译器完全省略参数?会std::monostate
工作吗?从我对 MSVC 的测试来看,using empty_type = struct {}
这不是解决方案。
解决方案
这就是哨兵的用途。
我假设您的迭代器看起来像这样:
struct iterator {
// ... usual iterator interface ...
// iterator knows when it's done
bool is_done() const;
};
您可以制作自己的哨兵类型:
struct is_done_sentinel { };
添加它们之间的比较(在 C++20 中只是一个运算符,在 C++17 中你必须编写所有四个):
bool operator==(iterator const& lhs, is_done_sentinel ) {
return lhs.is_done(); // adjust as appropriate for your actual iterator
}
然后让你的范围返回这个哨兵作为它的结束:
struct range {
iterator begin();
is_done_sentinel end() { return {}; }
};
这将具有您想要的行为:您的范围在迭代器完成时结束,并且检查没有开销。
推荐阅读
- google-bigquery - 第一行的物化视图
- angular - Angular 7 中 html 页面中嵌入 Typescript 的更好的错误消息
- import - Idris 没有正确安装/查找包
- amazon-web-services - 如何覆盖 AWS Batch 作业中的 docker 映像?
- svg - 在 safari 中平移时出现随机 svg 行
- python - How to Convert EST to Local Time with Dataframe
- python - 如何在python中将2个表与用户和时间戳合并
- python - How to fix "ord() expected a character, but string of length 0 found" error in Python
- android - 构建 Python 3.7 时 bz2 模块失败
- dataframe - 将数据类型字符串转换为 DataFrame 中的浮点数