所以,假设我有一些函数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
,但我想拥有vector push_back
,size
等功能。
那么,有没有办法通过传递矢量文字来调用函数,还是在函数声明(或调用)中有任何方法将initializer_list
转换为T类型的向量?
如果不可能,是否存在安全等特定原因?
我知道如果我指定类型,我可以这样做,例如
void print(std::vector<int> V);
print({1,2,3,4});
但为什么不用于模板呢?好像它几乎是一样的过程。
答案 0 :(得分:2)
您可以从初始化列表中轻松创建矢量:
$Arguments = @{
"title" = "type1"
}
& $CmdName @Arguments
当然,您也可以在实际拥有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
优于此解决方案。
答案 1 :(得分:2)
{1, 2, 3, 4, 5}
没有类型。
虽然可以推断为std::initilizer_list<T>
。
无法推断std::vector<T>
。
要解决您的问题,您可以为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}));