簡體   English   中英

將未知類型和大小的std :: array傳遞給模板函數的構造函數

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

此處引用的示例中,對於傳遞給函數的問題也得到了回答,但該問題與將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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM