Тип шаблона массив аргументов varadic шаблона - PullRequest
0 голосов
/ 14 мая 2018

Я создаю библиотеку для себя, которая содержит функции и макросы для вещей, которые я часто использую и не хочу постоянно перепечатывать или копировать / вставлять (иногда сотни строк). У меня есть кусок кода в старом проекте, который я должен постоянно копировать и вставлять, а затем изменять все имена переменных в соответствии с моим текущим проектом. Я хочу превратить кусок кода в функцию в моей библиотеке.

Большой блок форматов кода выводится в поле, поэтому, если вывод слишком длинный, он не разрушает границы, которые у меня могут быть, или идет прямо к краю консоли (что меня беспокоит). Пользователь пропускает верхний левый угол поля и предоставляет координату x правого края, чтобы текст не проходил. Остальные аргументы являются переменными или литералами, которые должны быть выведены. Кусок кода помещает все переменные и литералы в одну большую строку, которая затем выводится char на char, пока результат не достигнет границы x. Выходные данные затем продолжаются в координате х верхнего левого угла и на одну строку вниз.

Для того, чтобы это работало, функция должна иметь шаблон Varadic, позволяющий получать переменные суммы для нескольких типов выходных данных (аналогично cout << "I have " << 4.5 << " cookies and " << 2 << " friends.").

Шаблон завершен и работает, пока я не попытаюсь создать массив типа шаблона и инициализировать его.

template<typename ...Inputs>
void textBox(int x, int y, int xBoundary, const Inputs&... things) {
    Inputs arr[sizeof...(things)] = {things...};
}

В этот момент я получаю эту ошибку: parameter packs not expanded with '...' Note: 'Inputs'

Я использовал этот тип вещей раньше, но все входы были одного типа для этой функции, поэтому я легко мог сделать это:

template<typename ...Inputs>
void textBox(int x, int y, int xBoundary, const Inputs&... things) {
    std::string arr[sizeof...(things)] = {things...};
}

Это не дает ошибок, если, конечно, пользователь не пытается передать что-то кроме строки, поэтому я знаю, что моя ошибка связана с созданием массива типа шаблона. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 14 мая 2018

Массивы должны содержать элементы одного типа - они не являются неоднородными структурами данных.В вашем случае Inputs - это пакет, содержащий все типы things..., который не раскрывается, поэтому вы получаете сообщение об ошибке.

Вместо этого используйте std::tuple, который является гетерогенным контейнером:

std::tuple<std::decay_t<Inputs>...> tuple{things...};

Или std::make_tuple:

auto tuple = std::make_tuple(things...);

В C ++ 17 параметры шаблона могут быть опущены благодаря выводу аргумента шаблона класса :

std::tuple tuple{things...};

Если вы хотите перебрать things..., лучше не помещать их в std::tuple.В C ++ 17 вы можете использовать сложенное выражение для печати всех из них:

(std::cout << ... << things);

В C ++ 11 вы можете определить псевдорекурсивный вариационный шаблон:

template <typename T>
void print(const T& x)
{
     std::cout << x; 
}  

template <typename T, typename... Rest>
void print(const T& x, const Rest&... rest)
{
     print(x);
     print(rest...);
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...