LINUX.ORG.RU

История изменений

Исправление thunar, (текущая версия) :

Сейчас сформулирую полную задачу.

Есть, например, в классе такой метод:

template<int n, int d>
struct foo_t{
	//n -- число измерений
	//d -- размер аргумента form_t 
	//data[nx][ny][nz]
	/* ... */
	void inline operator ()(const form_t<d> cfs[]){
		/* ... */
		if constexpr(n==3){
			for(auto&&[i,x] : cfs[0]){ //d-раз
			for(auto&&[j,y] : cfs[1]){ //d-раз
			for(auto&&[k,z] : cfs[2]){ //d-раз
				auto cff = x*y*z;
				auto var = data[i][j][k];
				//do stuff with var
			}}}
			return;
		}
		/* ... */
	}
};

Соответственно, этих «do stuff with var» может быть много, и мне нужно вместо множества реализаций под каждый n и разные задачи вынести весь обход из метода в итератор, так что бы семантически это было что-то вроде

constexpr int n = 3, d=4;
foo_t<n,d> foo;
form_t<d> forms[n];
for(auto&&[cff,var] : pass(foo, cfs){
	//do stuff
}
Т.к. n и d — константы компиляции, то очень хочется сделать это рекурсивным шаблоном.

Исправление thunar, :

Сейчас сформулирую полную задачу.

Есть, например, в классе такой метод:

template<int n, int d>
struct foo_t{
	//n -- число измерений
	//d -- размер аргумента form_t 
	//data[nx][ny][nz]
	/* ... */
	void inline operator ()(const form_t<d> cfs[]){
		/* ... */
		if constexpr(n==3){
			for(auto&&[i,x] : cfs[0]){ //d-раз
			for(auto&&[j,y] : cfs[1]){ //d-раз
			for(auto&&[k,z] : cfs[2]){ //d-раз
				auto cff = x*y*z;
				auto var = data[i][j][k];
				//do stuff with var
			}}}
			return;
		}
		/* ... */
	}
};

Соответственно, этих «do stuff with var» может быть много, и мне нужно вместо множества реализаций под каждый n и разные задачи вынести весь обход в итератор, так что бы семантически это было что-то вроде

constexpr int n = 3, d=4;
foo_t<n,d> foo;
form_t<d> forms[n];
for(auto&&[cff,var] : pass(foo, cfs){
	//do stuff
}
Т.к. n и d — константы компиляции, то очень хочется сделать это рекурсивным шаблоном.

Исправление thunar, :

Сейчас сформулирую полную задачу.

Есть, например, в классе такой метод:

template<int n, int d>
struct foo_t{
	//n -- число измерений
	//d -- размер аргумента form_t 
	//data[nx][ny][nz]
	/* ... */
	void inline operator ()(const form_t<d> cfs[]){
		/* ... */
		if constexpr(n==3){
			for(auto&&[i,x] : cfs[0]){ //d-раз
			for(auto&&[j,y] : cfs[1]){ //d-раз
			for(auto&&[k,z] : cfs[2]){ //d-раз
				auto cff = x*y*z;
				auto var = data[i][j][k];
				//do stuff with var
			}}}
			return;
		}
		/* ... */
	}
};

Соответственно, этих «do stuff with var» может быть много, и мне нужно вместо множества реализаций под каждый n и разные задачи вынести весь обход в итератор, так что бы семантически это было что-то вроде

constexpr int n = 3, d=4;
foo_t<n,d> foo;
form_t<d> forms[n];
for(auto&&[cff,var] : pass(foo, cfs){
	//do stuff
}

Исходная версия thunar, :

Сейчас сформулирую полную задачу.

Есть, например, в классе такой метод:

template<int n, int d>
struct foo_t{
	//n -- число измерений
	//d -- размер аргумента form_t 
	//data[nx][ny][nz]
	/* ... */
	void inline operator ()(const form_t<d> cfs[]){
		/* ... */
		if constexpr(n==3){
			for(auto&&[i,x] : cfs[0]){ //d-раз
			for(auto&&[j,y] : cfs[1]){ //d-раз
			for(auto&&[k,z] : cfs[2]){ //d-раз
				auto cff = x*y*z;
				auto var = data[i][j][k];
				//do stuff with var
			}}}
			return;
		}
		/* ... */
	}
};

Соответственно, этих «do stuff with var» может быть много, и мне нужно вместо множества реализаций под каждый n вынести обход в итератор, так что бы семантически это было что-то вроде

constexpr int n = 3, d=4;
foo_t<n,d> foo;
form_t<d> forms[n];
for(auto&&[cff,var] : pass(foo, cfs){
	//do stuff
}