Czy to możliwe, że coś takiego istnieje?Czy jest możliwe rozwinięcie statycznej pętli w C++?
template<int Channel>
void deduce_mask(Matrix const &src, int mask[])
{
//I hope i could become a constant and the compiler would unroll the loop at compile time
for(int i = Channel; i != -1; --i)
{
//mapper is a helper class which translate two and three dimension into one dimension index
//constexpr makes it possible to find out the index at compile time
mask[mapper(0, 1, i)] = src(row - 1, col)[i];
mask[mapper(1, 1, i)] = src(row, col)[i];
mask[mapper(2, 1, i)] = src(row + 1, col)[i];
}
}
zamiast
template<int Channel>
class deduceMask
{
public:
static void deduce_mask(matrix const &src, int mask[]);
};
template<int Channel>
void deduce_mask(matrix const &src, int mask[])
{
mask[mapper(0, 1, Channel)] = src(row - 1, col)[Channel];
mask[mapper(1, 1, Channel)] = src(row, col)[Channel];
mask[mapper(2, 1, Channel)] = src(row + 1, col)[Channel];
deduceMask<Channel - 1>::deduce_mask(src, mask);
}
template<>
class deduceMask<-1>
{
public:
static void deduce_mask(matrix const &src, int mask[])
{
}
};
Drugie rozwiązanie jest jedynym rozwiązaniem mogłem wymyślić, kiedy chcę kompilator, aby dowiedzieć wynik na kompilacji time.Do mam łatwą drogę do sprawiają, że "i" staje się wartością stałą, jak metaprogramming solution? Dla mnie prosta pętla for jest znacznie łatwiejsza w pracy niż w wersji metaprogramming.
Przepraszam za mój biedny angielski, mam nadzieję, że wyjaśnię właściwie swój problem.
Możesz również napisać rekursywnie i użyć constexpr, jeśli wolisz ten typ składni? – Agentlien
Próbowałem utworzyć wersję constexpr, ale nie powiodło się, constexpr pozwala tylko na jedną instrukcję return. – StereoMatching
Jestem dość pewny, że większość współczesnych kompilatorów automatycznie wykonuje tę optymalizację, podobnie jak robią to dla pętli 'for' aż do stałej wartości (np.' For (int i = 0; i <5; i ++) '). Musisz jednak sprawdzić, żeby się upewnić. – ShdNx