3

我正在使用 hana 来确定一个对象是否有Length这样的成员:

using boost::hana::is_valid;


static const auto has_length
    = is_valid([](const auto& obj)
            -> decltype(obj.Length(),void()) {});

这很好用......我可以整天用它做静态断言,让我心满意足。所以下一步逻辑上是enable_if一个函数:

template<typename T>
auto foo(T t) -> std::enable_if_t<has_length(t), void>
{
}
struct mine
{
    int Length() const { return 0; }
};

int main()
{
    foo(mine{});
}

这工作得很好....但是一旦我将 更改Tconst T&,我们就会得到没有合适的重载的错误:godbolt

所以我的问题是:为什么会发生这种情况?

4

1 回答 1

1

问题是使用不是 constexpr 的引用调用函数不是 constexpr。这是hana::is_valid有用的地方,因为它返回一个integral_constant类似 - 的值,其中包含一个静态 constexpr 布尔值,因此我们可以只查看返回类型。见bool_

这是一个例子:

#include <boost/hana.hpp>
#include <type_traits>

namespace hana = boost::hana;

static auto has_length = hana::is_valid([](auto&& t)
  -> decltype(t.Length()) { });

template <typename T>
auto foo(T const& t)
  -> std::enable_if_t<decltype(has_length(t)){}, void>
                   // ^-- notice the return type 
                   // is a boolean integral constant
{ }

struct mine
{
  int Length() const { return 0; }
};

int main()
{
  foo(mine{});
}
于 2018-08-13T16:28:32.110 回答