将模板矢量文本作为参数传递
Passing template vector literal as a parameter
所以,假设我有一些函数print
:
template<typename T>
void print(std::vector<T> V)
要传递矢量进行打印,我必须进行
std::vector<int> v {1,2,3,4,5};
print(v);
这很好。我想知道的是,有没有任何方法可以将向量文字作为参数传递给函数?
所以我们的函数调用变成了
print({1,2,3,4,5})
并且不再需要初始化另一个临时变量?
我知道我可以使用std::initializer_list
,但我想拥有矢量、push_back
、size
等的特性。
那么,有没有任何方法可以通过传递向量文字来调用函数,或者在函数声明(或调用)中有没有任何方式可以将initializer_list
强制转换为T类型的向量?
如果不可能,是否有安全等特定原因?
我知道如果我指定类型,比如,我可以做到
void print(std::vector<int> V);
print({1,2,3,4});
但为什么不同样针对模板呢?这似乎是一个大致相同的过程。
您可以很容易地从初始化程序列表创建矢量:
template <class T>
void print(std::initializer_list<T> L)
{
std::vector<T> V(L);
// ...
}
【实例】
当然,对于手头实际上有std::vector
的情况,您也可以过载:
template <class T>
void print(std::initializer_list<T> L)
{
print(std::vector<T>(L));
}
template <class T>
void print(const std::vector<T> &V)
{
// Print as required
}
为了回答您的问题,为什么不能将原始print
模板直接与初始化程序列表一起使用:编译器无法推导出T
。请记住,模板可以是专门的—无法知道例如只有std::vector<int>
可以从std::initializer_list<int>
初始化。std::vector<MyCustomType>
的专业化也可以完全合法地提供这样的构造函数。
对评论做出反应:当然,如果这对你来说更可取,你可以直接在呼叫站点构建向量:
template <class T>
void print(std::vector<T> V)
{
// ...
}
print(std::vector<int>{1, 2, 3, 4, 5});
然而,我考虑添加print
的过载,使std::initializer_list
优于此解决方案。
{1, 2, 3, 4, 5}
没有类型。
可推导出CCD_ 15。
不能推导出CCD_ 16。
为了解决您的问题,您可以为initializer_list
添加过载
template <typename T>
void print(std::initializer_list<T> ini)
{
print(std::vector<T>(ini));
}
或者将initializer_list显式地转换为vector
template <typename T>
std::vector<T> as_vector(std::initializer_list<T> ini)
{
return ini;
}
然后(使用上述方法,可以避免重复类型T
,但std::vector<int>{1, 2, 3, 4}
是一种替代方法)
print(as_vector({1,2,3,4}));
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 将参数传递为"const"的奇怪效果
- 如何在 c++ 中将函数作为参数传递?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 将 QAction 的 QString 文本作为参数传递
- C++编译器如何在引用参数中实际传递文本常量?
- 将文本字符串作为常量字符 * 参数传递会导致代码分析器错误
- 将文本文件而不是用户输入作为命令行参数传递
- 将模板矢量文本作为参数传递
- c++中带文本的参数传递