我想测试是否可以通过使用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;
}
答案 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...))
{})
);
};