我可以在编译时告诉Boost.Phoenix lambda的一组特定输入类型是否有效?

时间:2013-02-14 21:56:01

标签: c++ boost lambda boost-phoenix

假设我有一个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(因为凤凰需要它)。

1 个答案:

答案 0 :(得分:1)

我认为凤凰城今天不可能。为了支持这种使用,enable_if必须在几乎所有函数调用中使用,这些函数调用在eval调用链中,在每个级别,甚至在Phoenix所依赖的其他库中。我知道Phoenix并不是那样编写的,而且很难想象,在Phoenix,Proto以及它们所依赖的所有库都在纯C ++ 11中重写之前,对代码的任何大量攻击都可以做到这一点。即使这样,也需要非常小心,所有潜在的错误都会出现在SFINAE内容中。

我只是没有看到它发生,抱歉。