Я хочу написать несколько функций, которые отличаются только типами аргументов. Я знаю, что C ++ имеет template
, чтобы хорошо справиться с этой проблемой (хотя пока не очень хорошо, лишь немногие компиляторы поддерживают ключевое слово export
, и это ключевое слово запрашивается для эффективности). Для простого примера я хочу:
template <typename T>
T add(T a, T b){
return a+b;
}
Однако в чистом C (иногда мне приходится выбирать чистый C, так как на некоторых платформах нет компилятора C ++), для разных версий должны быть разные имена функций, например
double addDouble(double a, double b){
return a+b;
}
int addInt(int a, int b){
return a+b;
}
Хммм, когда есть две версии, кажется нормальным, что я могу выполнить копирование и вставку в исходном файле; Однако на практике в функции будет много строк, а не просто оператор return
, и будет больше версий. Итак, мой вопрос: как элегантно реализовать серию функций в версиях разных типов?
Пока я пробовал некоторые решения, как показано ниже, но я думаю, что они далеки от хороших. Мне нужны ваши предложения, спасибо!
Решение 1:
#define mytype int
mytype addInt(mytype a, mytype b){
return a+b;
}
#undef mytype
#define mytype float
mytype addFloat(mytype a, mytype b){
return a+b;
}
#undef mytype
Недостаток решения 1: дублированного содержимого слишком много, и если я хочу изменить функцию, я должен изменить все версии.
Решение 2:
func.h
#ifndef FUNC_H
#define FUNC_H
#define add(a, b, typename) functionAdd##typename(a,b)
/* function declarations */
#define declared(typename) \
typename functionAdd##typename(typename, typename)
declared(int);
declared(float);
#endif
func.c
#include "func.h"
/* function code */
#define functionAdd(a, b, typename) \
typename functionAdd##typename(typename a, typename b){ \
return a+b; \
}
/* function bodies (definitions) */
functionAdd(a, b, int)
functionAdd(a, b, float)
main.c
#include <stdio.h>
#include "func.h"
int main()
{
int x1 = add(1, 2, int);
float x2 = add(3.0, 4.0, float);
printf("%d %f\n", x1, x2);
return 0;
}
Недостаток решения 2: Поскольку функция написана на define
, ее сложно отладить. Кроме того, запись \
раздражает. Хотя новую версию удобно добавлять, просто вставив declared(double)
в func.h и functionAdd(a, b, double)
в func.c, вы достигнете этой цели.