c++ - 如何在可变参数模板函数中访问参数

标签 c++ function c++11 parameters variadic-templates

在 C/C++ 中创建可变参数函数的旧方法是使用 cstdarg 中定义的 va_list、va_start、va_arg、va_end。 C++11 自带可变函数模板语法,但如何访问值?

//example
#include <iostream>
using namespace std;

template <typename... types>
void print(types... Params){
  //this is not working:
  long Param1 = Params[0];
  long Param2 = Params[1];
}

int main(){
  print(123, 456);
  print(123, "foobar");
}

最佳答案

这是一种非常简单(非破坏性)的方式,尽管可能不是最佳方式:

#include <iostream>
#include<tuple>
#include<cassert>

using namespace std;

template <typename... types>
void print(types... Params){
  long Param1 = std::get<0>(std::tie(Params...));
  long Param2 = std::get<1>(std::tie(Params...));
  assert(Param1 == 123 and Param2 == 456);
}
int main(){
  print(123, 456);
}

https://godbolt.org/z/V8VA0W

如果所有元素都是同一类型(假设您可以复制它们):

#include <iostream>
#include<tuple>
#include<cassert>

using namespace std;

template <typename... types>
void print(types... Params){
  std::array<long, sizeof...(Params)> params = {Params...};
  long Size = params.size();
  long Param1 = params[0];
  long Param2 = params[1];
  assert(Size == 2 and Param1 == 123 and Param2 == 456);
}

int main(){
  print(123, 456);
}

从你的问题中不清楚,但看起来你想打印列表中的所有元素,如果你只想这样做,那么你可以按如下方式进行(需要 C++17,但你可以这样做这与 c++11 中的一些工作有关):

#include <iostream>

using namespace std;

template <typename... types>
void print(types... Params){
    std::cout << "number of elements: " << sizeof...(Params) << " ";
    ((std::cout << Params), ...);
}

int main(){
  print(123, 456);
}

关于c++ - 如何在可变参数模板函数中访问参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318736/

相关文章:

c++ - 单次运行时指针值的变化

c++ - 运算符 << 如何与操纵器函数一起使用

javascript - for 循环中的 jQuery click() 函数显示意外行为

c++ - 修改函数中二维引用数组的值

c++ - 使用 mpirun/mpiexec 运行时检测不使用 MPI

c++ - 如何更改文本对齐方式 SFML/C++

c++ - 打开不存在的文件时如何使 ofstream 构造函数失败?

c++ - 为什么一个常量函数返回的volatile类型可以是常量?

C++11 线程段错误

c++ - 从 'mapped_type' 没有可行的转换