检测c ++数组中的数据类型

woo*_*hek 3 c++ arrays c++11 c++14

这是打印出buf数组的c ++代码,填充0,1,2,... 254

#include <iterator>
#include <iostream>
#include <numeric>

int main()
{
        int buf[255];

        auto it_b = std::begin(buf);
        auto it_e = std::end(buf);

        std::iota(it_b, it_e, 0);
        std::copy(it_b, it_e, std::ostream_iterator<decltype(*it_b)>(std::cout, " "));

        std::cout << std::endl;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图使它成为通用的,所以只有一个地方的类型是明确的给定 int

因为我需要明确声明类型,ostream_iterator我想知道实现这一目标的最佳方法是什么.

  1. decltype(*it_b)
  2. decltype(buf[0])
  3. 别的东西......

使用这种或那种方法的优点/缺点是什么?

在这个时候假设我们坚持使用C风格的数组.

Que*_*tin 7

要严格正确,您应该使用std::iterator_traits:

std::copy(it_b, it_e, std::ostream_iterator<
    typename std::iterator_traits<decltype(it_b)>::value_type
>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)

decltype(*it_b)单独存在的一个问题是,在大多数情况下它会返回一个引用,这会混淆您实例化的外部模板.您也可以手动删除引用:

std::copy(it_b, it_e, std::ostream_iterator<
    std::remove_reference_t<decltype(*it_b)>
>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)

  • @leemes取决于它.`std :: decay_t`模拟将其参数传递给函数,因此它会执行很多可能相关或不相关的内容.最强大的选项仍然是`iterator_traits`. (2认同)