C ++ Получение ряда элементов в шаблоне вариа - PullRequest
0 голосов
/ 11 декабря 2018

Итак, я пытаюсь получить несколько элементов в моем шаблоне переменных, например:

Test(const T& t...);

template<typename T>
inline Class<T>::Test(const T& t...){
     int num = sizeof...(t);
     ...
}

Однако он не компилируется, и я получаю следующие ошибки:

ошибка C3523: 'sizeof ...' требует в качестве аргумента нерасширенный пакет параметров

't' не является допустимым операндом для 'sizeof ...'.Вы хотели использовать 'sizeof'?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Попробуйте std::tuple метапрограммирование: std::tuple_size<std::tuple<Types...>>::value возвращает количество параметров типа.Например, этот код печатает 4:

#include <iostream>
#include <tuple>
#include <cstddef>

template<typename ...Types>
constexpr std::size_t Test(Types&& ... args){
    constexpr std::size_t sz = std::tuple_size<std::tuple<Types...>>::value;
    return sz;
}

int main()
{
    std::size_t val = Test(0, 0L, 'a', std::cin);
    std::cout << val;
}
0 голосов
/ 12 декабря 2018

Если бы T был пакетом параметров, вы могли бы использовать следующий синтаксис для объявления функции, которая принимает последовательность параметров с типами, соответствующими типам в пакете параметров:

inline Class<T>::Test(const T&... t) { /* ... */ }

Однако этоПохоже, что T не является пакетом параметров.Это просто параметр одного типа.Плюс, вы положили ... в неправильном месте.Поэтому вы действительно объявили функцию, которая принимает один параметр типа T, плюс многоточие в стиле C.(Да, запятая перед многоточием необязательна!)

Поэтому, когда вы пишете sizeof...(t), компилятор жалуется, потому что t не является пакетом.Это просто обычный параметр.

Возможно, вы хотели объявить Test функцией, которая принимает произвольное количество аргументов, но все типа const T&?К сожалению, в C ++ нет простого способа сделать это.См. Указание одного типа для всех аргументов, передаваемых в функцию переменной или функцию шаблона переменной без использования массива, вектора, структур и т. Д. для решений.

...