首页 > 解决方案 > 在编译时接受相同类型的参数并对其进行迭代的可变参数函数

问题描述

我正在寻找一种方法来实现 Variadic 函数,该函数在编译时接受相同类型的参数并且应该能够对其进行迭代。可变参数在最后,它们都具有相同的类型。像下面的东西 -

void SampleFunc(Other arguments(String may be)..., int... arg)
{
   for (const auto& val : arg)
   {
      // Each argument available here.
   }
}

然后我会像下面这样调用这个函数 -

SampleFunc("String", "{1,2,3,4})

最重要的是每次调用函数时可变参数都是硬编码的,所以我应该能够在编译时生成这个可变参数。

现在我正在接受如下所示的函数参数 -

void SampleFunc(std::string str, std::vector<int>& nums)

但这增加了每次调用函数时构建向量的运行时间成本,这是我想避免的。


更新 :-

我忘了提到这个函数在开始时还有其他参数。这是我的错,对此感到抱歉。我现在更新了我的例子。

标签: c++templatesc++17variadic-functionsfunction-templates

解决方案


如果参数在编译时已知,在中,使用折叠表达式可以执行类似的操作

#include <utility> // std::forward

template <typename Type>
void doSomething(Type&& arg) /* noexcept */
{
   // Each argument available here.
   std::cout << arg << "\n";
}

template <typename... Args> 
void SampleFunc(Args&&... args) /* noexcept */
{
   (doSomething(std::forward<Args>(args)), ...);
}

现在你可以像这样调用函数

SampleFunc(1, 2, 3, 4);   

并且使用doSomething你可以对每个参数做一些事情。

在线观看演示


在以前的编译器中,您可以通过扩展技巧模仿折叠表达式,如下所示

template <typename Type>
void doSomething(Type&& arg) /* noexcept */
{
   // Each argument available here.
   std::cout << arg << "\n";
}

template <typename... Args> 
void SampleFunc(Args&&... args) /* noexcept */
{
   using dummy = int[];
   (void)dummy {
      0, (doSomething(std::forward<Args>(args)), 0)...
   };
}

在线观看演示


推荐阅读