gpt4 book ai didi

c++ - 模板构造器

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:37 25 4
gpt4 key购买 nike

问题:我发现自己面临着无数重复的函数来支持不同类型的几乎相同的类似数组的输入。例如,函数 foo 可能在以下版本中可用:

void foo (int v); // single value, 99% of all use cases.
void foo (std::initializer_list<int> v);
void foo (const std::vector<int> &v);
void foo (int *v, int size);

这种重复困扰着我。我想要一个函数 foo,它可以用任何类型的类似数组的数据调用(单个值显然被视为大小为 1 的数组)。

可能的解决方案包括:

  • 始终使用 vector 版本。这会在每次使用时产生一些内存分配开销,并且由于我 99% 的使用都是针对单个值,所以我觉得这是不可取的。
  • 有一个指定迭代器对的接口(interface)。当尝试为单个值调用函数时,这再次失败。
  • 对类似数组的数据进行某种抽象,可以处理所有需要的输入类型。这是一种很有前途的方法,但我确实遇到了一些麻烦......

我的实现称为 mem_range,它提供了一个类似 vector 的接口(interface)(显然只包括不改变 vector 大小的操作)。应该通过 mem_range 的不同构造函数来处理各种类型的数组。

我无法指定应该采用 std::array 的构造函数。问题是数组大小,它是模板定义的一部分 - 我不知道如何创建一个构造函数来接受任何大小的数组。

template<typename T>
class mem_range {
public:
mem_range (T *begin, T *end) { } // ok
mem_range (std::vector<T> &vec) { } // ok

template<int array_size>
mem_range<array_size> (std::array<T, array_size> &arr) { } // not ok
}

最后一个构造函数在 MSVC2015 上产生“错误 C2988:无法识别的模板声明/定义”。我现在经历了很多变体,但没有一个能让编译器满意。

需要明确的是,根据我在 stackoverflow 上阅读的类似问题的答案:

  • 以任何方式调整类数组数据的大小不在范围内。如果我想要这种功能,我只需传递一个 std::vector。
  • 我知道有很多标题相似的问题。这些似乎都没有像样的答案,通常只是“你为什么要这个?”。

我正在努力使这项工作在 MSVC2015 和现代 GCC 上运行,因此 C++14/17 没问题(只要支持)。

最佳答案

在声明模板化构造函数时,模板被理解为属于构造函数,因此您无需在那里指定它。

数组参数后还缺少右括号 >

所以构造函数应该是这样的:

template<int array_size>
mem_range(std::array<T, array_size>) { }

当然,您应该考虑将数组对象作为对常量的引用传递,并使用正确的类型(参见例如 this std::array reference`),即

template<std::size_t array_size>
mem_range(std::array<T, array_size> const&) { }

关于c++ - 模板构造器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36978727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com