【问题标题】:What is the advantage of Hana's type_c-and-declval dance when querying whether a SFINAE-friendly expression is valid?在查询 SFINAE-friendly 表达式是否有效时,Hana 的 type_c-and-declval dance 有什么优势?
【发布时间】:2022-09-17 03:13:47
【问题描述】:

一方面,函数boost::hana::is_valid呈现如下

检查 SFINAE 友好的表达式是否有效。

给定一个对 SFINAE 友好的函数,is_valid 返回给定参数的函数调用是否有效。具体来说,给定一个函数f 和参数args...

is_valid(f, args...) == whether f(args...) is valid

结果以编译时Logical 的形式返回。

并附带一个使用示例(来自同一链接页面):

    struct Person { std::string name; };
    auto has_name = hana::is_valid([](auto&& p) -> decltype((void)p.name) { });
 
    Person joe{\"Joe\"};
    static_assert(has_name(joe), \"\");
    static_assert(!has_name(1), \"\");

我们看到馈送到is_valid 的lambda 反过来又馈送了我们馈送到has_name 的实际对象。

另一方面,C++ Templates - The Complete Guide 这本书提出了一个非常相似的解决方案(实际上作者引用了Boost.HanaLoius Dionne),我现在省略了它的细节。但是,此解决方案的使用方式略有不同:

constexpr auto hasFirst = isValid([](auto x) -> decltype((void)valueT(x).first) {});
static_assert(!hasFirst(type<int>));
struct S { int first; };
static_assert(hasFirst(type<S>));

以上假设存在valueTtype 在下面定义/声明

template<typename T>
struct TypeT {
  using Type = T;
};

template<typename T>
constexpr auto type = TypeT<T>{};

template<typename T>
T valueT(TypeT<T>);

现在,如果我理解正确的话,valueTtype 大致对应于boost::hana::traits::declvalboost::hana::type_c,所以书中的示例应该映射到以下内容

constexpr auto hasFirstH = is_valid([](auto x) -> decltype((void)traits::declval(x).first) {});
static_assert(!hasFirst(hana::type_c<int>));
struct S { int first; };
static_assert(hasFirst(hana::type_c<S>));

但这有什么好处呢?

this answer from Louis Dionne 我最初理解这是一个品味问题,但后来我认为可能是这种情况对于那个特定的场景而不是一般。

    标签: c++ c++17 template-meta-programming sfinae boost-hana


    【解决方案1】:

    在写这个问题时,我搜索了更多(主要是在其中放置相关链接),最终我确实在Boost.Hana > User Manual > Introspection > Checking expression validity > Non-static members 的Boost.Hana 文档中找到了答案:使用hana::type_c 来换行对象中的T 类型(不是T 类型,而是hana::type&lt;T&gt;! 类型)和hana::declval 在没有对象时编写这些类型特征很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-09
      • 2017-05-17
      • 2012-09-21
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多