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

Passing template vector literal as a parameter

本文关键字:参数传递 文本      更新时间:2023-10-16

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

那么,有没有任何方法可以通过传递向量文字来调用函数,或者在函数声明(或调用)中有没有任何方式可以将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}));