【问题标题】:C/C++ function using float or double or int使用 float 或 double 或 int 的 C/C++ 函数
【发布时间】:2011-05-28 08:21:45
【问题描述】:

我有单独的函数用于读取文本文件(取决于它是 int、float 还是 double)。我只想要一个带有附加参数的 one 函数(不使用后续的 IF 语句)。有人有想法吗?

下面是我当前函数的形式。

float * read_column_f (char * file, int size_of_col){
...
col = (float*) malloc (height_row * sizeof(float));
...  return(col);}


double *    read_column_d (char * file, int size_of_col){
...
col = (double*) malloc (height_row * sizeof(double));
...  return(col);}


int *   read_column_i (char * file, int size_of_col){
...
col = (int*) malloc (height_row * sizeof(int));
...  return(col);}

编辑:我想在 C++ 中实现这一点,使用的 C 样式语法是由于内存偏好。

【问题讨论】:

  • 我删除了 C++ 标签,以及现存的 IOStreams 和函数重载,如果你想在没有它们的情况下执行此操作,再加上代码样式几乎可以保证这是纯 C 代码。跨度>
  • 最有可能使用const char *file
  • size_of_col 是否指的是您传递给函数的值(float、double、int)的大小?
  • size_of_col = 列中的条目数,

标签: c++ c text io


【解决方案1】:

ANSI C 不支持函数重载,这是您想要完成的。但是,C++ 可以。在此处查看 StackOverflow 链接:Default values on arguments in C functions and function overloading in C

【讨论】:

    【解决方案2】:

    您不能重载返回类型。您可以通过引用作为函数参数返回值:

    void read_column (char * file, int size_of_col, float&);
    void read_column (char * file, int size_of_col, int&);
    

    ...

    或创建一个模板:

    template<class T> T read_column (char * file, int size_of_col);
    

    【讨论】:

    • 仅对返回类型进行模板化是否可行?
    • 可以只对返回类型进行模板化,但你将得到的东西并不比具有不同名称的多个函数好多少,因为编译器将无法扣除返回类型为你。用户代码如下所示:double d = read_column&lt;double&gt;( "file.txt", 10 ); --i.e.用户代码必须明确类型。
    • @user502515:是的。它将被称为read_column&lt;int&gt;read_column&lt;float&gt;read_column&lt;double&gt;。它比具有不同名称的多个函数要好得多,因为所有三个函数都有一个源,使用T 代替要读取的类型。
    • 在你的第一个选项中,我认为最后一个参数必须是float*&amp;,因为(无论出于何种原因)提问者的函数返回一个指向分配数组的指针。
    • 想必你可以结合这两种方法,并使用一个引用T*&amp;的模板。
    【解决方案3】:

    使用模板,例如:

    template<typename Type>
    Type * read_column(char * file, int size_of_col)
    {
        Type* col = (Type*) malloc(size_of_col * sizeof(Type));
        ...
        return(col);
    }
    

    然后这样调用:

    int    * col_int    = read_column<int>   ("blah", 123);
    float  * col_float  = read_column<float> ("blah", 123);
    double * col_double = read_column<double>("blah", 123);
    etc.
    

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2017-03-04
      相关资源
      最近更新 更多