当前位置: 首页 > 知识库问答 >
问题:

从模板化向量函数中删除 cv 限定符

谷梁俊楚
2023-03-14

我正在编写一些代码,从给定的向量中随机选择一个具有任何泛型类型的元素。我成功地制作了一个返回随机元素副本的函数,但是如果有一个类似的函数返回该元素的迭代器,对我来说会很方便。这就是我所拥有的,其中随机迭代器是通过生成器函数向开始迭代器添加随机数而产生的:

template <class T>
typename std::vector<T>::iterator pickElementIterator(const std::vector<T>& v)
{
    if (v.empty())
    {
        // error
        return v.end();
    }

    return v.begin() + generate(v.size());
}

如果没有代码使用它,这将成功编译。但当我尝试用Foo类型替换某个向量时,使用g会出现以下错误:

无法转换'(

两次退货。似乎它在试图转换类型以便返回时给类型添加了一个const。我在两个返回上都尝试了std::decay,但是它不接受这些参数。这就是我对模板编程的了解,而且在我所看到的任何地方都找不到太多这方面的内容。

注意:“typename”是返回类型,因为否则g会抱怨:

在“std::vector ”之前需要“类型名称”

共有2个答案

沈凯康
2023-03-14

我建议你让 auto 决定返回哪种迭代器。如果使用 C 11,则可以使用尾随返回类型,如 decltype(v.begin()),而在 C 14 及更高版本中,则不需要这样做。

如果您还使用模板模板参数,则不必使其仅适用于vectorsv.begin()generate(v.size())需要随机访问,所以我建议使用std::next来获得结果迭代器。

例:

#include <iterator> // std::next

template <template <class, class...> class C, class T, class... Args>
auto pickElementIterator(const C<T, Args...>& c) -> decltype(c.begin()) {
    if(c.empty()) return c.end();
    return std::next(c.begin(), generate(c.size()));
}
岑叶秋
2023-03-14

std::vector

编译失败的原因是const_iterators无法转换为可变的iterator类型。修复方法很简单:将返回类型更改为const_iterator

template <class T>
typename std::vector<T>::const_iterator pickElementIterator(const std::vector<T>& v)
//                       ^~~~~~~~~~~~~~

如果您使用的是c 14或更高版本,您也可以只使用<code>auto</code>而不使用声明的返回类型,这样它就可以自己推导它,例如:

template <class T>
auto pickElementIterator(const std::vector<T>& v)

注意:您观察到在不使用时编译成功的原因是因为模板在实例化之前不能被完全评估。由于模板的专门化,编译器必须假设任何依赖于模板参数的东西(例如,type T)都可能产生有效的实例化。

例如,编译器必须假设可能存在一个T使得constd::向量

因此,在实际实例化模板之前,您不会经常看到语法错误之外的诊断

 类似资料:
  • 这应该很容易,但我一直在撞我的头。 我有数字向量 我有一个数值向量v2。v2始终是v1的子集。 我想从v1中删除v2中的所有元素,但每个v2元素只删除一个(而且完全是一个)v1元素。 所需输出 如果我希望将保留在v1之外。使用很容易。 如果我希望将与v1保持一致。此外,也能起到作用。 如果我希望将与v1保持一致。现在返回。不是我想要的。 当答案输入时,我很可能会用头撞我的键盘,但现在我还没有得到最

  • 我希望编写一个模板函数来接受Eigen::vectrox*(float/int/double)和std::vector 如何声明模板?下面的方法不起作用。 其基本原理是不编写单独的函数所有不同的组合。

  • 问题内容: 我有一个包含经纬度坐标列表的数据框: 我的目标是使用Haversine函数找出KM中每个项目之间的距离: 我的目标是得到一个看起来像result_df的数据框,其中的值是每个提供程序ID之间的距离: 我可以循环执行此操作,但是速度非常慢。我正在寻找一些帮助将其转换为向量化方法: 问题答案: 为了矢量化此代码,您将需要对完整的数据框进行操作,而不要对单个经纬度进行操作。我对此做了尝试。我

  • 如果没有其他重载(比如,

  • 我试图在变量函数模板上使用'decltype'来获取其返回值类型,然后使用它来定义成员变量。但我一直在犯这样的错误: 基本上,decltype失败并将声明为int,而不是推断的返回类型。 它的工作原理是当我提供的所有参数的值,但这不是我要找的行为。因为我不知道该函数有多少参数,所以它必须保持为可变模板函数。 我计划如何使用类模板的示例: 如果我没有任何成员变量,并使用作为: 它编译,因此我相信能够

  • 我试图用成员模板函数实现一个可变类模板,其模板参数独立于类模板参数,但在定义成员模板时遇到了问题。 我将问题简化为尝试编译此文件(抱歉,无法进一步简化): 在尝试编译(C 11)时,我遇到以下错误: 我很确定它归结为第一个和第五个错误,但不知道我做错了什么。为什么

  • 我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确

  • WordPress有一个名为的内置过滤器,可以在可视化模式下添加文本。此函数添加