假设我有一个 Boost.Phoenix lambda 表达式,如下所示:
_1 * 4.5 + (3.0 / _2)
在给定与参数 _1
、_2
等关联的类型列表的情况下,是否有一种好方法可以在编译时检测 lambda 表达式是否有效在?我想我想使用 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 需要它)。
最佳答案
我认为在今天的菲尼克斯是不可能的。为了支持这种使用,enable_if
必须在 Phoenix 在 eval 调用链中进行的几乎每个函数调用中使用,在每个级别,甚至在 Phoenix 依赖的其他库中也是如此。我知道 Phoenix 不是那样写的,很难想象在 Phoenix、Proto 和它们依赖的所有库都用纯 C++11 重写之前,对代码进行任何数量的黑客攻击都能做到这一点。即便如此,也需要格外小心,确保所有潜在错误都出现在 SFINAE 内容中。
我只是没有看到它发生,抱歉。
关于c++ - 我可以在编译时判断 Boost.Phoenix lambda 的一组特定输入类型是否有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14884789/