Я пытаюсь сохранить пакет параметров ссылок lvalue вариативного шаблона для последующего использования.
У меня сейчас работает следующее.
template <typename... Ts>
class Foo {
private:
std::tuple<Ts...> m_args;
public:
template<typename... Args>
Foo(Args&&... args) : m_args(std::make_tuple(std::forward<Args>(args)...))
{
}
};
int main() {
int x = 10;
int y = 20;
Foo<int, int> foo(x, y);
}
Однако я хотел бы сохранить пакет параметров в качестве ссылки, чтобы впоследствии получить доступ к тому же объекту. Я не знаю, как я могу это сделать. Любая помощь будет оценена по достоинству.





Лучшее, что я могу представить, - это использование std::forward_as_tuple.
К сожалению, я не вижу способа использовать его с идеальной пересылкой: если вы хотите зарегистрировать значения в кортеже внутри класса, вы должны выбрать тип кортежа один раз для всех.
Лучшее, что я могу представить, - это кортеж константных ссылок; что-то вроде следующего
template <typename ... Ts>
class Foo
{
private:
std::tuple<Ts const & ...> m_args;
public:
Foo (Ts const & ... as) : m_args{std::forward_as_tuple(as...)}
{ }
};
Надеюсь, нет необходимости помнить, что висячие ссылки могут быть опасны для решения, основанного на кортеже ссылок.
@ZincFur - Вы имеете в виду, что все типы Ts... одного типа? Так почему вы используете std::tuple, а не std::array?
Мне не нужна динамическая инициализация, и я не хочу указывать количество аргументов в качестве параметра шаблона. Можно ли использовать std :: array для хранения пакета параметров?
@ZincFur - как насчет использования SFINAE, чтобы наложить, что количество имен типа Args... в точности равно размеру std::array? И, да, вы можете использовать std::array для хранения пакета параметров (если m_args - это std::array<T, Dim>, вы можете написать Foo (Args const & ... as) : m_args{{ as... }}), но, к сожалению, вы не можете создавать массивы ссылок.
Тип известен, и будет изменяться только количество аргументов.