c++ - 我可以在编译时判断 Boost.Phoenix lambda 的一组特定输入类型是否有效吗?

标签 c++ boost lambda boost-phoenix

假设我有一个 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/

相关文章:

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - 在 C++ 中检查哈希的大小

c++ - 无法包含来自 boost 库的 header

c++ - boost::multi_array 调整大小不起作用

c# - LINQ to SQL lambda 表达式。 OrderBy、Case When、Dynamic Where

angular - Angular 4 的箭头函数(Lambda 函数)

c++ - 别名可变参数模板函数

c++ - 如何根据 RFC 3339 格式化 boost::date_time-object

go - 使用接受 io.Writer 作为 HandleFunc 的函数

c++ - Xcode 中缺少 C++ 命令行工具应用程序的 info.plist 文件