首页 > 解决方案 > 标准空参数类型的功能类似于 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 {}这不是解决方案。

标签: c++c++20

解决方案


这就是哨兵的用途。

我假设您的迭代器看起来像这样:

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 {}; }
};

这将具有您想要的行为:您的范围在迭代器完成时结束,并且检查没有开销。


推荐阅读