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

标签 c syntax

我如何处理一个函数 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/

相关文章:

c - 如何使用 C 获得类似于 Linux top 的输出

c - 简单的 C 程序无法正确计算

syntax - 纯粹用于语法检查的工具?

c - C 中的 int* ptr 和 int *ptr 有什么区别?

c# - 测试一个对象不是一个类型

c - 为 winsock recvfrom 设置超时

c - 如何在不停止 C 程序的情况下按下最后一个键?

c++ - 将单个像素值从 RGB 转换为 YUV420 并保存帧 - C++

Scala String* 类型(在函数 args 中)

ruby - 将错误对象分配给 `rescue` 方法的变量时使用的语法 (=>) 是什么?