Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / integer_sequence со смещением в качестве параметра std::get / 5 сообщений из 5, страница 1 из 1
06.11.2018, 15:27
    #39728612
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
integer_sequence со смещением в качестве параметра std::get
Всем привет!

Есть класс, который принимает переменное количество аргументов и собирает их в кортеж для последующей обработки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
template<typename ...ArgsT>
class Example
{
public:
	Example(ArgsT...Args) : m_t(Args...)
	
private:
	std::tuple<ArgsT...> m_t;

public:
	decltype(auto) operator()(void) const
	{
		return Invoke(std::index_sequence_for<ArgsT...>{});
	}

	template <size_t... Indices>
	decltype(auto) Invoke(std::index_sequence<Indices...>) const
	{
		auto& Item1 = std::get<0>(m_t);
		
		// делаем что нам надо с параметром Item1 и забываем про него
		// остальные параметры из ArgsT отправляем дальше в виде (ArgsT + 1)... 
		// вот тут то вся и проблема
		
		// вот так можно отправить в полном виде, т.е. от 0 до size_t...(ArgsT) - 1
		return FinalStep(std::get</*? Indices + 1 ?*/>(m_t)...);
	}
	
	template<typename ...RestT>
	decltype(auto) FinalStep(RestT... Args) const
	{
		//	...	
	}
};


нашел шаблон строящий index_sequence со смещением
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template <size_t O, size_t ... Is>
std::index_sequence<(O + Is)...> add_offset(std::index_sequence<Is...>)
{
    return {};
}

template <size_t O, size_t N>
auto make_index_sequence_with_offset()
{
    return add_offset<O>(std::make_index_sequence<N>{});
}


шаблон строится - все ок, но, если я его применяю,

то начинает материться std
автор1>test.main.cpp
1>...\msvc\14.15.26726\include\utility(542): error C2338: tuple index out of bounds
Выносить первый параметр отдельным typename T значением нельзя (считаем что невозможно по ТЗ)
Может здесь кто подскажет, как скрутить эту гниду, а то уже на второй день мозги плавятся и начинаю ходить кругами
--------------------------------------------------------------
o(O_O)o
...
Рейтинг: 0 / 0
06.11.2018, 16:54
    #39728688
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
integer_sequence со смещением в качестве параметра std::get
На форум я прихожу не за ответами, а волшебством: стоит только написать о своей проблеме... и ты тут же ее сам решаешь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template <size_t... Indices>
decltype(auto) Invoke(std::index_sequence<Indices...>) const
{
	auto& Item1 = std::get<0>(m_t);
	// делаем что нам надо с параметром Item1 и забываем про него
	
	decltype(auto) OffsetIndicies = make_index_sequence_with_offset<1UL, sizeof...(ArgsT) - 1UL>();
	
	return FinalStep(OffsetIndicies);
}

template<size_t... Indicies>
decltype(auto) FinalStep(std::index_sequence<Indices...>) const
{
	return DoSomething(std::get<Indices>(m_t)...);	//  it finally works!
}


а дальше будет еще страшнее...
...
Рейтинг: 0 / 0
06.11.2018, 17:22
    #39728725
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
integer_sequence со смещением в качестве параметра std::get
...
Рейтинг: 0 / 0
06.11.2018, 17:31
    #39728733
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
integer_sequence со смещением в качестве параметра std::get
не знал, что у этого феномена даже есть какое-то научное обоснование (хотя начинал подозревать об этом),
думал просто - закон Мерфи: потратил хренову тучу времени, чтобы изложить свои мысли так, чтобы постороннему человеку было понятно, что ты от него хочешь, а потом - бац! да вот же оно!

столько времени впустую потратил, а оказывается сам смог до всего допереть...
только народ зря беспокоил
...
Рейтинг: 0 / 0
06.11.2018, 23:42
    #39728935
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
integer_sequence со смещением в качестве параметра std::get
Cerebrum, не зря.

Ад ждет тебя!

И даже оттуда тебя будут вызывать аколиты, чтобы разобрать твои заклинания.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / integer_sequence со смещением в качестве параметра std::get / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]