Страницы

Поиск по вопросам

вторник, 12 марта 2019 г.

Формирование std::tuple в C++11

Доброго времени суток, уважаемые.
У меня следующий вопрос:
Пусть есть шаблонный класс вот такого вида:
template class MyClass { public: using TupleT = std::tuple; ... private: TupleT m_tuple; };
и есть шаблонный класс
template WrapperT { ... };
Хочется сделать следующее: изменить тип m_tuple внутри MyClass с указанного выше на тип TupleWrappedT таким образом, что WrapperT будет выбирать по индексу элемент из TupleT и оборачивать его в себя. Вопрос, собственно, в том, как такой тип определить. Я придумал только
template using TupleWrappedT = std::tuple...>;
возможно ли обойтись без приставки template ? С учетом того, что элементы Is должны быть последовательны в диапазоне от 0 до sizeof...(Ts), а значит, известны на этапе компиляции.
Заранее благодарю за ответ.


Ответ

Держите :)
#include
template struct WrapperT {};
template static std::tuple...> wrap_impl(std::index_sequence);
template static auto wrap() -> decltype(wrap_impl(std::make_index_sequence::value>()));
template class MyClass { public: using TupleT = std::tuple; using TupleWrappedT = decltype(wrap()); private: TupleT m_tuple; };

int main() { static_assert(std::is_same::TupleT, std::tuple>::value, "!"); static_assert(std::is_same::TupleWrappedT, std::tuple>, WrapperT<1, std::tuple>>>::value, "!"); return 0; }

Комментариев нет:

Отправить комментарий