标准空参数类型的功能类似于 void

now*_*owi -1 c++ c++20

标准中是否有类似的类型void?即实际上从参数列表中省略的东西,如标签式结构?

void foo(){}
void foo(std::empty_type){}
// assembly for these two should be the same, no arguments
Run Code Online (Sandbox Code Playgroud)

我的用例:我正在编写自己的基于范围的for迭代器对象。问题是返回的对象足以检查它是否在最后(我正在包装一个 API)。这种基于范围的for受到了很大的打击,任何小的优化都会对代码性能产生巨大的提升。问题是,我不能声明一元,operator !=也不能void按照标准声明类型的符号,所以我想用大小为 0 的对象来模拟它。

我可以使用什么类型来提示编译器完全省略参数?会像std::monostate工作吗?从我对 MSVC 的测试来看,using empty_type = struct {}不是解决方案。

Bar*_*rry 6

这就是哨兵的用途。

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

struct iterator {
    // ... usual iterator interface ...

    // iterator knows when it's done
    bool is_done() const;
};
Run Code Online (Sandbox Code Playgroud)

您可以制作自己的哨兵类型:

struct is_done_sentinel { };
Run Code Online (Sandbox Code Playgroud)

添加它们之间的比较(在 C++20 中只是一个运算符,在 C++17 中你必须写所有四个):

bool operator==(iterator const& lhs, is_done_sentinel ) {
    return lhs.is_done(); // adjust as appropriate for your actual iterator
}
Run Code Online (Sandbox Code Playgroud)

然后让你的范围返回这个哨兵作为它的结束:

struct range {
    iterator begin();
    is_done_sentinel end() { return {}; }
};
Run Code Online (Sandbox Code Playgroud)

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