gpt4 book ai didi

c - 在 C 中使用模板函数的最短示例?

转载 作者:行者123 更新时间:2023-12-04 10:35:19 26 4
gpt4 key购买 nike

我如何处理一个函数 echo_tpl ,它可以接受类型为 intstring1 参数,以及打印出来?

最佳答案

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com