【问题标题】:Question on how SFINAE is achieved using this code segment关于如何使用此代码段实现 SFINAE 的问题
【发布时间】:2019-07-20 05:42:11
【问题描述】:

参考

SFINAE

问题与以下代码段有关:

template<typename T>
class is_class {
    typedef char yes[1];
    typedef char no [2];
    template<typename C> static yes& test(int C::*); // selected if C is a class type
    template<typename C> static no&  test(...);      // selected otherwise
  public:
    static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};

在上述类模板定义中,is_class&lt;T&gt;::valuepublic 定义使用类模板is_class 实例化中使用的参数T 实例化嵌套静态模板函数test

如果以上解释正确,我有以下问题:

  1. 如何解释嵌套静态模板函数test的重载版本?

SFINAE 如何使用上述重载为给定的T 填充模板类is_class&lt;T&gt; 的公共布尔变量value,根据sizeof(test&lt;T&gt;(0)) == sizeof(yes) 使用真或假?我不确定我是否理解在test&lt;T&gt; 的实例化中传递看似随机整数值0 应该选择还是消除任一过载?有人可以举例说明吗?

  1. 我也不清楚使用yes[1]no [2] 这两个嵌套类型的逻辑,这两个类型都被定义为char。假设 yes[1] 是大小为 1 的 char 数组的类型别名,no[2] 是大小为 2 的 char 数组的类型别名,那么这个逻辑如何使用 SFINAE 集成到重载选择/消除中?

欣赏你的想法。

【问题讨论】:

    标签: c++ logic implementation sfinae


    【解决方案1】:

    让我们澄清一些误解:

    1. yes[1] 不是类型。 yes 是一个类型,它是char [1] 的别名。
    2. no[2] 不是类型。 no 是一个类型,它是char [2] 的别名。

    当涉及重载决议时,如果Tclass,则test(...) 的优先级较低。因此,调用test&lt;T&gt;(0) 将解析为第一个重载,其返回类型为yes&amp;。因此,

    sizeof(test&lt;T&gt;(0)) == sizeof(yes) 计算结果为
    sizeof(yes) == sizeof(yes),计算结果为 true

    如果T 不是一个类,则没有int T::*。这就是 SFINAE 部分。对于这种情况,选择test(...) 作为重载,其返回类型为no&amp;。因此,

    sizeof(test&lt;T&gt;(0)) == sizeof(yes) 计算结果为
    sizeof(no) == sizeof(yes),计算结果为 false

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多