Почему это происходит [?]
Все идет хорошо, когда все типы Args...
различны.
Вы получаете ошибку, когда типы сталкиваются.
Это потому, что std::get<T>(tuple_val)
, где T
- это тип, «не может скомпилироваться, если в кортеже нет только одного элемента этого типа» (как вы можете прочитать в на этой странице ),И это кажется мне разумным.
Так что все идет хорошо с
store_in_tuple<int, float, double, size_t>
, потому что все типы различны, и вы получаете ошибку от
store_in_tuple<int, float, double, int>
, потому чтодва вызова std::get<int>(m_tuple_args)
завершились неудачно.
и есть ли обходной путь?
Используйте числовую версию std::get()
, которая всегда доступна, даже когда типы сталкиваются.
Обычный способ в C ++ 14 проходить через вспомогательную функцию с std::index_sequence
и std::make_index_sequence
(или std::index_sequence_for
).
Кажется сложным, но очень простым
template <std::size_t ... Is>
void func_helper (std::index_sequence<Is...> const)
{ func_tuple(std::get<Is>(m_tuple_args)...); }
void func ()
{ func_helper(std::index_sequence_for<Args...>{}); }
Если вы можете использовать C ++ 17, вы можете использовать std::apply()
, который (я полагаю) использует std::index_sequence
под капотом.