我如何处理一个函数 echo_tpl
,它可以接受类型为 int
或 string
的 1 参数,以及打印出来?
最佳答案
C 没有模板。我认为您能做的最好的事情就是使用 union 或让函数具有不同的名称。后一种使用不同名称的方法是准标准方法(例如 fabs
fabsf
fabsl
,也是 OpenGL 的 heavily used这也解释了 C 不能重载函数的事实)
void echo_tpl_s(char const *string) { /* ... */ }
void echo_tpl_i(int number) { /* ... */ }
int main(void) {
echo_tpl_s("Hello world");
echo_tpl_i(42);
}
如果有很多通用代码,您可能会决定将其分解到单独的函数中
void echo_tpl_s(char const *string) {
prepare_output_device();
printf("%s", string);
unprepare_output_device();
}
void echo_tpl_i(int number) {
prepare_output_device();
printf("%d", number);
unprepare_output_device();
}
或者您可以采用union 方式,这将使函数名称相同,但会用元信息破坏参数类型。
enum Type {
Number,
String
};
struct Value {
enum Type type;
union {
int number;
char const *string;
} u;
};
void echo_tpl(struct Value value) {
switch(value.type) {
case Number: printf("%d", value.u.number); break;
case String: printf("%s", value.u.string); break;
}
}
int main(void) {
echo_tpl((struct Value) {
.type = String,
.u.string = "Hello world"
});
}
如果您想将值存储在某处,然后执行打印函数而不关心传递给它的值类型, union 方式特别适合。在 C89 中,您需要单独创建值,因为它没有复合文字
int main(void) {
struct Value value;
value.type = String;
value.u.string = "Hello world";
echo_tpl(value);
}
不过,为此创建函数是个好主意
struct Value stringval(char const *string) {
struct Value value;
value.type = String;
value.u.string = string;
return value;
}
struct Value numberval(int number) {
struct Value value;
value.type = Number;
value.u.number = number;
return value;
}
int main(void) {
echo_tpl(stringval("Hello world!"));
}
一些编译器可能会提供用于编写此类内容的扩展。例如Clang提供 function overloading在 C 中。
void echo_tpl(int value) __attribute__((overloadable)) {
printf("%d", value);
}
void echo_tpl(char const *value) __attribute__((overloadable)) {
printf("%s", value);
}
这解决了函数调用端不依赖类型的问题。在定义方面,您仍然必须编写两次代码。这主要是因为(正如另一个答案所解释的那样)C 没有类型通用的输出函数。当然,如果您使用此功能,您的代码将变得不可移植。
关于c - 在 C 中使用模板函数的最短示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2891527/