c++ - 模板构造函数

标签 c++

问题:我发现自己面临着许多重复的函数来支持不同类型的几乎相同的类似数组的输入。例如,函数 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/

相关文章:

c++ - 提高代码质量?

c++ - 指针、数组和新运算符

c++ - 双向链表 : Unresolved Externals

c++ - 正确支持 STL 中成员函数的 volatile 限定符

c++ - 如何写多个if条件

c++ - 使用Cuda Ubuntu 16/04构建C++ OpenCV 4

c++ - 如何在 BB 10 级联中加载第二个 .qml 文件

c++ - 我应该使用哪种数据结构

c++ - 抽象类的用户定义构造函数

android - NDK Clang 错误 : undefined reference to 'localeconv'