Как использовать шаблоны c ++ для добавления фрагментов кода в зависимости от значения параметра функции? - PullRequest
0 голосов
/ 02 августа 2011

Я выполняю некоторые функции изображения, в которых много повторяющегося кода, например:

int r,sr;
int g,sg;
int b,sb;
int a,sa;
...
for(...){
    sr += input[posin+0];
    sg += input[posin+1];
    sb += input[posin+2];
    sa += input[posin+3];
}
...
output[posout+0] = sr;
output[posout+1] = sg;
output[posout+2] = sb;
output[posout+3] = sa;

Как я могу использовать шаблоны для этого из приведенного выше кода:

int r,sr;
int g,sg;
int b,sb;
...
for(...){
    sr += input[posin+0];
    sg += input[posin+1];
    sb += input[posin+2];
}
...
output[posout+0] = sr;
output[posout+1] = sg;
output[posout+2] = sb;

или т. Д., В зависимости от значения, которое я даю функции? Я мог бы просто добавить if () в циклы, но это замедлит функцию. Итак, я хочу вырезать части кода в зависимости от значения BytesPerPixel, которое я даю функции, как?

Кроме того, значение BytesPerPixel должно стать константой внутри функции, поэтому, если я использую его где-то и его значение равно 3, вычисление * BytesPerPixel станет * 3. я хочу, чтобы это произошло, потому что это сделает это быстрее, а умножение на 4, 2 или 1 будет еще быстрее после того, как компилятор оптимизирует его.

1 Ответ

3 голосов
/ 02 августа 2011

Оба из них могут быть легко уменьшены до:

int values[N];
// ...
for (...) {
    for (int i(0); i < N; ++i) {
        values[i] += input[posin + i];
    }
}

for (int i(0); i < N; ++i) {
    output[posout + i] = values[i];
}

N может быть предоставлено в качестве нетипичного параметра шаблона; например:

template <unsigned N>
void f() {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...