【问题标题】:Use type traits to detect whether an array (or a pointer) was passed使用类型特征来检测是否传递了数组(或指针)
【发布时间】:2021-05-23 02:12:16
【问题描述】:

我正在尝试获取一个简单的示例来了解如何使用std::enable_if,这是问题所在:

我正在阅读 David Vandevoorde、Nicolai M.Josuttis 编写的教科书 C++ 模板完整指南,第 7 章第 4 节。

本章提到:“您可以使用类型特征来检测是否传递了数组(或指针)”,及其以下代码:

template<typename T,
         std::enable_if_t<std::is_array_v<T>>>
void foo(T&& arg1, T&& arg2)
{
    
}

我的问题是,上面的代码应该如何调用和使用?例如,我试过:

int x[] = {1, 2, 3};
int y[] = {1, 2, 3, 4, 5};
foo(x, y);

但是没有编译,网上没找到类似的用法,谁能给我一些提示或代码指导如何使用上面的代码?

【问题讨论】:

    标签: c++ templates perfect-forwarding forwarding-reference


    【解决方案1】:
    1. 您应该为第二个模板参数指定一个默认值,或者将其移至返回类型。

    2. 使用转发引用T 可能会被推导出为左值引用(当传递像x 和y 这样的左值时),它不是一个数组并且为std::is_array 生成false。

    3. x 是 int[3] 类型,y 是 int[5] 类型。它们是不同的类型,导致T 的类型推断失败。

    所以

    template<typename T,
             std::enable_if_t<std::is_array_v<std::remove_reference_t<T>>>* = nullptr>
    void foo(T&& arg1, T&& arg2)
    { 
    }
    

    或

    template<typename T>
    std::enable_if_t<std::is_array_v<std::remove_reference_t<T>>> foo(T&& arg1, T&& arg2)
    { 
    }
    

    然后

    int x[] = {1, 2, 3};
    int y[] = {4, 5, 6};
    foo(x, y);
    

    LIVE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2017-02-19
      • 2021-03-10
      • 2011-06-24
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多