Как получить доступ к параметрам в функции шаблона Variadic - PullRequest
0 голосов
/ 27 мая 2019

Старый способ создания функции с переменным значением в C / C ++ - это использование va_list, va_start, va_arg, va_end, определенных в cstdarg. 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");
}

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Это очень простой (не разрушительный) способ сделать это, хотя, возможно, и не оптимальный:

#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);
}
0 голосов
/ 27 мая 2019

Существует решение с использованием оператора << здесь: <a href="https://stackoverflow.com/a/5495309/5581893">https://stackoverflow.com/a/5495309/5581893

Но на самом деле это не отдельный вызов функции, это серия вызовов оператора <<, и функция не может быть в глобальной области видимости, это должен быть метод в типе. </p>

...