Страницы

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

среда, 22 января 2020 г.

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

#cpp #cpp11


Доброго времени суток, уважаемые.

У меня следующий вопрос:

Пусть есть шаблонный класс вот такого вида:

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), а значит, известны
на этапе компиляции.

Заранее благодарю за ответ.
    


Ответы

Ответ 1



Держите :) #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; }

Ответ 2



Возможно я чего-то не понял, но разве std::tuple_element и std::get не решают задачу? Пример: template class WrapperT { using Element = typename std::tuple_element::type; Element mElement; public: WrapperT(const TupleT& tuple) : mElement{std::get(tuple)} { } };

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

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