C++ - 为 std::array 迭代器的 std::array 创建别名

标签 c++ templates iterator alias

我有一个 std::array<Point, SIZE>::iterator 类型的迭代器数组, 其中SIZE是一个模板变量。

所以拥有这些迭代器的数组就是

std::array<std::array<Point, SIZE>::iterator, SIZE> 

用我拥有的函数数量写起来很痛苦。

我正在考虑为这种类型起别名,但我不知道怎么做,同时有模板变量 SIZE .

我试过了

template<std::size_t SIZE>
using p_iterators = std::array<std::array<Point, SIZE>::iterator, SIZE>;

在我做的函数里面:

template<std::size_t SIZE>
template <typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

我遇到了这些错误:

closest_pair.cpp:24:70: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, long unsigned int _Nm> struct std::array’
 using p_iterator = std::array<std::array<Point, SIZE>::iterator, SIZE>;
                                                                      ^
closest_pair.cpp:24:70: error:   expected a type, got ‘std::array<Point, SIZE>::iterator’
closest_pair.cpp:42:1: error: ‘p_iterator’ does not name a type
 p_iterator<SIZE> eucledian_closest(T &points) {

我不知道如何为这样的类型起别名,甚至不知道如何在函数中有另一个模板时将它与该模板一起使用 template <typename T> .

最佳答案

在 C++ 中,dependent模板类型名称需要关键字 typename .

你应该改变你的别名

template<std::size_t SIZE>
using p_iterators = std::array<std::array<Point, SIZE>::iterator, SIZE>;

template<std::size_t SIZE>
using p_iterators = std::array<typename std::array<Point, SIZE>::iterator, SIZE>;

然后将模板函数签名更改为:

template<std::size_t SIZE, typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

在上面的例子中,当调用函数时,eucledian_closest ,您至少需要明确提供 SIZE参数如 eucledian_closest<3>(myArry) .如果不这样做,类型推导将无法推导出 SIZE。 ,加上不利的一面是你应该有匹配的尺寸。如果你希望类型推导隐式推导它 SIZE给你:

你可以这样做:

template<template <typename, std::size_t> class Array,
                                          typename T,
                                          std::size_t SIZE
        >
p_iterators<SIZE> eucledian_closest(Array<T, SIZE>& points) {}

通过以上,你可以做到eucledian_closest(myArray) .但是,如果您不需要使用 SIZE在函数中,你可以简单地做

template<typename T>
auto eucledian_closest(T& points) {}

简单地称它为eucledian_closest(myArray) .

关于C++ - 为 std::array 迭代器的 std::array 创建别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39800900/

相关文章:

c++ - 交换两个完整的 vector/队列/堆栈时间成本?

c++ - 将同一 vector 中的元素push_back安全吗?

C++ 模板在参数中指定类型

c++ - 在使用正则表达式执行函数时逐行解析 inFile

c++ - Valgrind memcheck 编程启用

c++ - 从 ‘arma::umat’ 到 ‘arma::mat’ 的转换

c++ - 如何为动态类型成员调用boost register_type函数

javascript - 快速路由模板

python - 如何将列表复制到 list2 的长度?

c++ - 在这个类中存储迭代器是不明智的吗?还有什么方法可以遍历这个序列?