微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

boost::hana::always 除了“总是返回它的第一个参数”之外还有什么作用?

如何解决boost::hana::always 除了“总是返回它的第一个参数”之外还有什么作用?

doc page of boost::hana::always我读到了

always(x)一个函数,使得

always(x)(y...) == x

对于任何y...

这让我觉得它的行为应该与这个 lambda 没有任何不同:[](auto const&...){ return false; }

但是确实如此。例如,以下代码打印 11,但如果我将第三个 lambda 更改为 hana::always(false),则它打印 00,表明 always 正在吞下任何参数。>

#include <boost/hana/functional/always.hpp>
#include <boost/hana/functional/overload.hpp>
#include <iostream>

auto fun = boost::hana::overload(
        [](int){ return true; },[](double){ return true; },[](auto const&...){ return false; }
        );

int main() {
    std::cout << fun(1) << fun(1.0) << std::endl;
}
  • 这是预期的吗?
  • 如果是,为什么?
  • 无论是否预期,是什么导致了这种行为?

顺便说一下,我刚刚发现了 boost::hana::overload_linearly在这种情况下,它不能替代 boost::hana::overload(因为 always 不会得到所有调用,它将是 [](int){ return true; } 贪婪),但很高兴知道它。

解决方法

实际上,always 有不同的重载(因为它将引用作为返回值处理)。

所以,简化版:

template <typename T>
struct my_always
{
     T res;

     template <typename ...&& Ts>
     T& operator ()(Ts&&...) /* mutable */ { return false; } // #1

     template <typename ...&& Ts>
     const T& operator ()(Ts&&...) const { return false; } // #2
};

然后

auto fun = boost::hana::overload(
        my_always<bool>{ false; },// #1 & #2
        [](int){ return true; }    // #3
        );

std::cout << fun(1);

可能的重载是:

  • bool& my_always<bool>::operator ()(int&&) #1
  • const bool& my_always<bool>::operator ()(int&&) const #2
  • bool lambda::operator() (int) const #3

这里的所有都是 viable,但 #1best match(因为 fun 不是 const(并且 int 并不比int&&)).

使用 const fun,#3 将是最佳匹配(#1 不可行,#2 和 #3 之间的决胜局是模板状态)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?