假设我有一个Boost.Phoenix lambda表达式,如下所示:
_1 * 4.5 + (3.0 / _2)
在编译时,是否有一种很好的方法可以检测lambda表达式是否有效,给定与参数_1
,_2
等相关联的类型列表?我想我想使用enable_if
来确定lambda是否支持输入类型。如果是这样,lambda将被直接调用,如果不是,我想生成一个no-op。伪代码就是这样的:
template <typename F, typename A1, typename A2>
enable_if<F::is_supported<A1, A2>, result_of<F(A1,A2)>::type >::type func(F func, A1 arg1, A2 arg2)
{
func(A1, A2);
}
template <typename F, typename A1, typename A2>
disable_if<F::is_supported<A1, A2> >::type func(F func, A1 arg1, A2 arg2)
{
}
我只是不确定is_supported
将如何实施,或者甚至是否可能。我没有使用C ++ 11;我只假设C ++ 03(因为凤凰需要它)。
答案 0 :(得分:1)
我认为凤凰城今天不可能。为了支持这种使用,enable_if
必须在几乎所有函数调用中使用,这些函数调用在eval调用链中,在每个级别,甚至在Phoenix所依赖的其他库中。我知道Phoenix并不是那样编写的,而且很难想象,在Phoenix,Proto以及它们所依赖的所有库都在纯C ++ 11中重写之前,对代码的任何大量攻击都可以做到这一点。即使这样,也需要非常小心,所有潜在的错误都会出现在SFINAE内容中。
我只是没有看到它发生,抱歉。