将未知类型和大小的 std::数组传递给模板化函数的构造函数

Passing a std::array of unknown type and size to a constructor of a templated function

本文关键字:构造函数 函数 数组 未知 std 类型      更新时间:2023-10-16
在这里

引用的示例中,传递给函数也回答了类似的问题,但这个问题是关于将 std::array 传递给模板化类的构造函数。

模板化类的示例:

#include <array>
template<typename T, std::size_t N>
class Pipeline {
public:
    Pipeline(std::array<T, N>& buffer);
...

对此构造函数的调用示例:

std::array<uint16_t, 100> buffer;
Pipeline<uint16_t, buffer.size()> pipeline(buffer);

我觉得这很丑陋,因为有关缓冲区的信息(包括类型和长度)在调用中被有效地复制了。以下是我想做的:

std::array<uint16_t, 100> buffer;
Pipeline pipeline(buffer);

这是不允许的,尽管允许使用与调用模板化函数(而不是模板化类的构造函数)相同的技术。

有没有办法定义构造函数,以便允许我想做的调用?

正如注释中的状态,在 C++17 中,使用

std::array<uint16_t, 100> buffer;
Pipeline pipeline(buffer); // Pipeline<uint16_t, 100>

在 C++17 之前,您需要使用帮助程序函数:

template <typename T, std::size_t N>
Pipeline<T, N> make_pipeline(std::array<T, N>& buffer)
{
    return Pipeline<T, N>(buffer);
}
auto pipeline = make_pipeline(buffer); // Pipeline<uint16_t, 100>

这假设您的类是可移动(或复制)可构造的。

在 C++17 之前,一点杂技可以给你你想要的:

#include <iostream>
#include <array>
template<typename T, std::size_t N>
class Pipeline
{
    public:
    Pipeline(std::array<T, N>& buffer)
    {
        for(size_t scan(0); scan != buffer.size(); ++scan)
        {
            std::cout << buffer[scan] << std::endl;
        }
    }
};
int main()
{
    std::array<int, 10> array({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
    Pipeline<std::tuple_element<0, decltype(array)>::type, std::tuple_size<decltype(array)>::value> test(array);
    return 0;
}