[英]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.