【问题标题】:Function ignoring its argument(s)忽略其参数的函数
【发布时间】:2021-02-18 00:52:36
【问题描述】:

这主要是一个好奇的问题。

我看到了这样的代码(我对它的作用不感兴趣)

constexpr auto xxx = boost::hana::overload(
    [](SomeType& x){ /* x is used and something is returned */ },
    [](SomeOtherType1&){ /* no-op in this case */ },
    [](SomeOtherType2&){ /* no-op in this case */ }
);

后两个 lambda 表达式只是忽略它们的论点。

因为我知道boost::hana::always 是创建一个忽略其参数并始终返回传递给always 的参数的函数,所以如果 Hana(或另一个库)提供类似的函数来忽略一个参数(或也包括所有参数),这样两个 lambda 表达式都可以替换为,比如说,blackHole,我知道这不是一个数学函数。

当我在 cppreference 上看到 std::ignore 的结果时,我很高兴,但不……这是完全不同的事情。

【问题讨论】:

    标签: c++ functional-programming boost-hana function-object


    【解决方案1】:

    所以您基本上是在询问库中是否有一个全局函数对象或某个类在调用时像[](auto &&) {} 一样工作?我不知道 STL 中有这样的功能。 C++20 添加了std::identity,其工作方式类似于[](auto &&in){return in;},所以不完全是您想要的,但非常接近。在C++20 之前,您可以为此滥用其他函数,例如std::as_conststd::ignore::operator=,尽管我不知道返回void 的函数。

    编辑:关于std::ignore::operator=std::ignore 被定义为一个对象,这样std::ignore = blub; 对任何blub 都没有影响。这也可以写成std::ignore.operator=(blub);。但是现在我考虑一下,这并没有太大帮助,因为您不能将该函数直接传递给例如一个 stl 算法,你必须以某种方式包装它。

    顺便说一句,我的建议是你在某个地方定义

    const static auto do_nothing = [](auto &&){};
    // Requires C++14, if you have C++17 available, use
    constexpr auto do_nothing = [](auto &&){};
    

    并完成它。滥用某些 STL 函数可能会让阅读您的代码的人感到困惑,而恰当命名的 lambda 则完全没有问题。

    【讨论】:

    • 后者是什么 (std::ignore::operator=)?能给个链接吗?
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2017-03-08
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-07-04
    相关资源
    最近更新 更多