将未知类型和大小的 std::数组传递给模板化函数的构造函数
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;
}
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参