È possibile che esista qualcosa del genere?È possibile sviluppare il ciclo statico per il ciclo in 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];
}
}
invece di
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[])
{
}
};
La seconda soluzione è l'unica soluzione che ho potuto venire di quando voglio che il compilatore di capire il risultato in fase di compilazione time.Do Ho un modo semplice per rendere la "i" un valore costante come la soluzione di metaprogrammazione? Per me, un ciclo for semplice è molto più semplice da utilizzare piuttosto che la versione metaprogrammazione dello .
Ci scusiamo per il mio scarso inglese, spero di spiegare correttamente il mio problema.
Si potrebbe anche scrivere in modo ricorsivo e utilizzare constexpr, se si preferisce quel tipo di sintassi? – Agentlien
Ho provato a creare una versione di constexpr ma non è riuscito, constexpr consente solo un'istruzione return. – StereoMatching
sono abbastanza certo che la maggior parte dei compilatori moderni fanno questa ottimizzazione automaticamente, proprio come lo fanno per 'for' loop fino a un valore costante (ad esempio' for (int i = 0; i <5; i ++) '). Dovresti controllare per essere sicuro. – ShdNx