【问题标题】:Can nullptr be used as a type?nullptr 可以用作类型吗?
【发布时间】:2019-01-05 12:13:19
【问题描述】:

我在学习enable_if 的用法时偶然发现了以下代码。

template <class T,
         typename std::enable_if<std::is_integral<T>::value,
                                 T>::type* = nullptr>
void do_stuff(T& t) {
  std::cout << "do_stuff integral\n";
    // an implementation for integral types (int, char, unsigned, etc.)
}

困扰我的是,在模板参数中,nullptr 被用作std::enable_if&lt;std::is_integral&lt;T&gt;::value, T&gt;::type* 的默认参数,这也是一个类型。

我不确定我们如何将文字分配给类型。不应该是nullptr_t吗?

【问题讨论】:

  • 默认参数呢? void foo(int = 0)?是不是很像?
  • @Fureeish 我明白了。我从没想过为模板参数分配默认“值”也是可能的。谢谢
  • 由于templates 可以同时包含类型和值,这非常方便:>

标签: c++ c++11 templates nullptr


【解决方案1】:

此模板接受非类型的第二个参数,即指针typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, T&gt;::type *,因此nullptr 用作此指针的默认值。请注意,第二个参数中的typename 用于使编译器确定::type 作为一个类型,它不是像typename T 这样的普通类型模板参数的开头

【讨论】:

    【解决方案2】:

    nullptr 不是类型,它是一个值(nullptr_t 类型,可以转换为任何指针类型 IIRC)。否则,nullptr 的任何标准用法都像:

    int* a = nullptr;
    

    不会工作。

    这是一个未命名的默认模板参数,用于允许在模板声明中使用 SFINAE 而不是使用返回类型。基本上是这样的:

    template<int=0>
    void foo();
    

    使用 SFINAE 技巧/enable_if

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 1970-01-01
      • 2013-02-10
      • 2015-12-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2021-05-07
      • 2013-12-03
      相关资源
      最近更新 更多