Boost.Hana 测试 lambda 是否可以使用特定参数调用

Boost.Hana test if lambda is callable with particular argument

我想测试是否可以使用 Boost.Hana 以特定参数调用 callable lambda。编译器抱怨 callable 需要 0 个参数,但提供了 1 个。如果 if_ 确实根据条件 is_callable 进行编译,那么 if_ 不是编译时间吗?

也许有人知道如何让代码工作。

#include <boost/hana.hpp>

int main(){

  namespace bh = boost::hana;

  auto is_callable = bh::is_valid([](auto&& callable, auto&& args) -> decltype(bh::unpack(args, callable)){});        

  auto callable = [](){};
  auto arg = 1;
  auto args = bh::make_tuple(arg);

  bh::if_(is_callable(callable, args),
                   [arg](auto callable){ callable(arg);},
                   [](auto callable){})(callable);

  return 0;
}

正如 Jason Rice 在评论中提到的,失败的原因是 hana::unpack 对 SFINAE 不友好。解决这个问题的最简单方法是我们自己为 hana::is_valid 调用可调用函数,使用 hana::unpack 将参数解压到 hana::is_valid:

的结果中
auto const is_callable = [](auto&& callable, auto&& args) {
    return bh::unpack(args,
        bh::is_valid([&callable](auto&&... args)
            -> decltype(callable(args...))
        {})
    );
};

Live demo on Compiler Explorer