2

假设我有一个 Boost.Phoenix lambda 表达式,如下所示:

_1 * 4.5 + (3.0 / _2)

有没有一种好方法可以在编译时检测 lambda 表达式是否有效,给定与 arguments 相关的类型列表_1_2等等?我在想我想用它enable_if来确定 lambda 是否支持输入类型。如果是这样,将直接调用 lambda,而如果不是,我想生成一个无操作。伪代码将是这样的:

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(因为 Phoenix 需要它)。

4

1 回答 1

1

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

我只是没有看到它发生,对不起。

于 2013-02-15T17:53:42.237 回答