将模板矢量文字作为参数传递

时间:2015-12-09 10:52:19

标签: c++ vector

所以,假设我有一些函数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_backsize等功能。

那么,有没有办法通过传递矢量文字来调用函数,还是在函数声明(或调用)中有任何方法将initializer_list转换为T类型的向量?

如果不可能,是否存在安全等特定原因?

我知道如果我指定类型,我可以这样做,例如

void print(std::vector<int> V);
print({1,2,3,4});

但为什么不用于模板呢?好像它几乎是一样的过程。

2 个答案:

答案 0 :(得分:2)

您可以从初始化列表中轻松创建矢量:

$Arguments = @{
    "title" = "type1"
}

& $CmdName @Arguments

[Live example]

当然,您也可以在实际拥有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}));