如何根据表达式在Boost.Hana中是否有效来过滤类型元组?

时间:2016-10-29 10:54:16

标签: c++ boost metaprogramming boost-hana

在一个简化示例中,我在元组中有两种类型,我想创建另一个元组,它只包含表达式有效的类型(在本例中我使用的是+运算符)。

我的尝试是这样的:

#include <boost/hana.hpp>
#include <boost/hana/experimental/printable.hpp>

#include <iostream>

namespace hana = boost::hana;

struct foo {};

const auto result{hana::filter(hana::tuple_t<int, foo>, [](auto type) {
  const auto has_plus{hana::is_valid([](auto t)
    -> decltype((void) hana::traits::declval(t) + hana::traits::declval(t)) {})};

  return has_plus(type);
})};

int main()
{
  std::cout << hana::experimental::print(result) << std::endl;
}

输出'()',即。没有类型匹配我期望元组result应包含type<int>

我正在使用与Boost 1.62一起打包的Boost.Hana版本。

1 个答案:

答案 0 :(得分:4)

您的问题在于运营商优先级。

(void)hana::traits::declval(t) + hana::traits::declval(t)

相同
((void)hana::traits::declval(t)) + hana::traits::declval(t)

以下结果是您所期望的结果:

(void)(hana::traits::declval(t) + hana::traits::declval(t))

demo