Предположим, у меня есть
template<int ...>
struct Ints { };
class MyClass
{
public:
Ints<1, 2, 3> get() { return Ints<1, 2, 3>(); }
};
То, что я хочу сделать, просто.
template <class T>
vector<int> MyFunc1(T& x)
{
Ints<S...> result = x.get();
vector<int> t = { S... };
return t;
}
Примерно так. (Здесь MyClass
может быть одним из примеров T
) По-видимому, для компилятора S...
кажется недействительным.
template <class T, int... S>
vector<int> MyFunc2(T& x)
{
Ints<S...> result = x.get();
vector<int> t = { S... };
return t;
}
Это тоже не работает. Я думаю, что из get()
S...
становится специфичным и автоматически выводимым, но компилятор не распознает его. (Я не уверен, но C++ не выводит параметры шаблона, смотрящие внутри функции, а только аргументы и возвращаемый тип)
Единственный способ, который я нашел, - это использовать другую функцию, которая узнает, что int...
было.
template <int ...S>
vector<int> temp(Ints<S...> not_used)
{
return { S... };
}
template <class T>
vector<int> MyFunc3(T& x)
{
auto result = x.get();
return temp(result);
}
Он работает хорошо, но требует еще одной дополнительной вспомогательной функции, которая ничего не делает, а просто обеспечивает синтаксически понятный способ сопоставления S...
с использованием шаблонов.
Я действительно хочу сделать это только в одной функции. Действительно ли мне нужно определять вспомогательную функцию всякий раз, когда я хочу получать пакеты параметров, каждый раз?
Изменение: Ints
и MyFunc
просто игрушечный пример. Я хочу знать общий метод получения параметров шаблона!