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