Как заменить шаблоны C ++ на C совместимые без изменения остальной части кода? - PullRequest
2 голосов
/ 10 февраля 2020

Я работаю над написанным на C ++ кодом и пытаюсь преобразовать его в C для сборки на встроенной платформе.

Мне интересно, как эффективно преобразовать шаблоны для выполнения той же функции в C без изменения остальной части кода.

вот пример файла из моего проекта:

template <typename T,int width,int depth>
void relu(T arr[][width][depth],T layermap[][width][depth]){
     for(int k=0;k<depth;k++)
     {
       for(int j=0;j<width;j++)
       {
           for (int i=0;i<width;i++)
           {
              /*max*/
             layermap[i][j][k]=((arr[i][j][k]>0)? arr[i][j][k]:0);
           }
       }
     }

}

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Эта шаблонная функция не может быть заменена макросом, потому что препроцессор C не может выводить значения width и depth. Лучшее, что я могу предложить, это переместить часть кода в макрос C и добавить поверх него оболочку шаблона C ++. Это сохранит совместимость с существующим кодом C ++, но код C должен будет передавать ширину и глубину вручную:

// C header
#define crelu(arr, layermap, width, depth) do { \
        for (int i=0;i<width;i++) \
            for(int j=0;j<width;j++) \
                for(int k=0;k<depth;k++) \
                    layermap[i][j][k]=((arr[i][j][k]>0)? arr[i][j][k]:0); \
    } while(0)
// c++ header
template <typename T,int width,int depth>
void relu(T arr[][width][depth],T layermap[][width][depth]) {
    crelu(arr, layermap, width, depth);
}
2 голосов
/ 10 февраля 2020

Шаблон функции не является функцией. Функция не может делать то, что делает шаблон функции. Набор функций может делать то же, что и шаблон функции (в некоторой степени; в коллекции функций отсутствует вывод аргументов шаблона, но это просто syntacti c sugar). Строгий способ реализации сопоставимого набора функций в C заключается в следующем:

void relu_float_1_1 (float arr[][1][1],  float layermap[][1][1]);
void relu_float_1_2 (float arr[][1][2],  float layermap[][1][2]);
// ... other sizes
void relu_double_1_1(double arr[][1][1], double layermap[][1][1]);
void relu_double_1_2(double arr[][1][2], double layermap[][1][2]);
// ... other sizes
// ... other types

Вам нужно написать только те, которые вы используете.


Тем не менее, вы обычно не пишите подобные функции в C. Прямая транслитерация редко дает хорошие результаты, если целью является перевод одного языка на другой.

Еще одна версия стиля C заключается в передаче измерений во время выполнения:

void relu_float (int width, int depth, float       arr[][width][depth],
                                       float  layermap[][width][depth]);
void relu_double(int width, int depth, double      arr[][width][depth],
                                       double layermap[][width][depth]);
// ... other types
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...