c++ - 数组的大小是否协变?

标签 c++ arrays c++11 polymorphism

有没有办法使用新的std::array以数组的大小多态地键入?也就是说,如果我具有以下形式的函数

void DoSomething(std::array<int, 5>& myArray) {
    /* ... */
}

那么在数学上是否明确定义了执行以下操作(即使它不是合法的 C++ 代码?)

std::array<int, 10> arr;
DoSomething(arr);

Imof 这在数学上是明确定义的,有没有办法写 std::array这样它的数组元素是连续的并且这段代码可以编译?我能想到的唯一技术是使用一些奇怪的模板元程序,其中 std::array<T, N+1>继承自 std::array<T, N> ,但我不认为这会强制数组元素连续。

最佳答案

直接?没有。

但是,您可以使用编译时多态性来实现非常相似的东西,并且您可以编写一个引用包装器,使其更易于在代码中使用:

#include <array>
#include <cstddef>

template <typename T, std::size_t N>
struct ref_array_of_at_least
{
    template <std::size_t M>
    ref_array_of_at_least(T (&a)[M])
        : data_(a)
    {
        static_assert(M >= N, "Invalid size");
    }

    template <std::size_t M>
    ref_array_of_at_least(std::array<T, M>& a)
        : data_(&a[0])
    {
        static_assert(M >= N, "Invalid size");
    }

    T* data_;
};

用作:

void f(ref_array_of_at_least<int, 5>) { }

int main()
{
    std::array<int, 5> x;
    std::array<int, 6> y;
    std::array<int, 4> z;
    f(x); // ok
    f(y); // ok
    f(z); // fail
}

(您需要向 ref_array_of_at_least 添加一些 operator[] 重载等,并且需要一些工作才能使其 const 正确,但这是一个开始展示了你所寻求的可能性。)

关于c++ - 数组的大小是否协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4731695/

相关文章:

java - 为什么我的堆排序比 Java 和 C++ 的排序函数快?

c++ - 修改 std::vector 函数(继承?)

c++ - 为什么 `has_construct<Alloc, T, Args...>::value` 在 gcc (false) 和 clang (true) 上给出不同的值?

c++ - 字符串文字和模板函数的多个版本

python - 为什么我不能改变 numpy 的数组?

c++ - 使用ros launch创建一个目录,然后将它的路径传递给不同的节点

c++ - 为什么 `(a--> 0)` 和 `((a--) > 0)` 相同?

c++ - QTcpSocket 不加载 ssl

python - 如何使用在对角线上具有特定值 K 的 numpy 创建单位矩阵

c - 如何用C找到数组中3个最大的偶数?