このようなものが存在する可能性はありますか?C++で静的forループを開発することは可能ですか?
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];
}
}
代わりの
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[])
{
}
};
第二の溶液は、私は、コンパイラがコンパイルtime.Doで に結果を把握したいときに考え出すことができる唯一のソリューションです私はへの簡単な方法を持っています"i"をメタプログラミングソリューションの のように一定の値にしますか?私にとって、単純なforループはメタプログラミング版の ではなく、もっと簡単に作業できます。
私の貧しい私の英語のために申し訳ありません、私は私の問題を適切に説明することを願っています。
また、そのような構文の方が望ましい場合は、再帰的に記述してconstexprを使用することもできます。 – Agentlien
私はconstexprバージョンを作成しようとしましたが、失敗しました。constexprは1つのreturn文しか許可しません。 – StereoMatching
ほとんどの現代のコンパイラは、 'for(int i = 0; i <5; i ++)')などの定数値まで、 'for'ループの場合と同じように、この最適化を自動的に行います。あなたは確かに確かめるためにチェックする必要があります。 – ShdNx