2

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

我的尝试是这样的:

#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 版本。

4

1 回答 1

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))

演示

于 2016-10-29T11:03:45.643 回答