在编译时,我能告诉Boost.Fenix lambda的一组特定输入类型是否有效吗

Can I tell at compile time whether a specific set of input types to a Boost.Phoenix lambda is valid?

本文关键字:一组 输入 有效 是否 类型 编译 lambda Fenix Boost      更新时间:2023-10-16

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

_1 * 4.5 + (3.0 / _2)

给定与参数_1_2等相关的类型列表,是否有一种好的方法可以在编译时检测lambda表达式是否有效?我想使用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(因为Phoenix需要它)。

我认为这在菲尼克斯是不可能的。为了支持这种使用,enable_if必须用于Phoenix在eval调用链中进行的几乎每一个函数调用,在各个级别,甚至在Phoenix所依赖的其他库中,并且它们所依赖的所有库都是用纯C++11重写的。即便如此,所有潜在的错误都会出现在SFINAE内容中,这也需要非常小心。

对不起,我只是没想到会发生这种事。