Boost.Hana测试lambda是否可通过特定参数调用

时间:2019-07-09 07:54:39

标签: c++ sfinae compile-time boost-hana

我想测试是否可以通过使用Boost.Hana调用带有特定参数的callable lambda。编译器抱怨callable期望使用0个参数,但是提供了1个。如果if_是否根据条件is_callable进行编译,这不是一个编译时间吗?

也许有人对如何使代码起作用的想法。

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

1 个答案:

答案 0 :(得分:2)

正如杰森·赖斯(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