Доброго времени суток, уважаемые.
У меня следующий вопрос:
Пусть есть шаблонный класс вот такого вида:
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;
}
Комментариев нет:
Отправить комментарий