【问题标题】:function generalization in CC中的函数泛化
【发布时间】:2021-04-01 15:22:12
【问题描述】:

我对 C 很陌生。

我已经编写了以下代码。以下所有功能几乎相同。我只是想知道有没有办法将以下函数简化为通用函数

struct tensor add(struct tensor t1, struct tensor t2){

    int data[t1.size];

    int i = 0;
    while (i < t1.size) { data[i] = t1.data[i] + t2.data[i]; i++; }

    return Tensor(t1.rank, t1.shape, data);
}

struct tensor sub(struct tensor t1, struct tensor t2){

    int data[t1.size];

    int i = 0;
    while (i < t1.size) { data[i] = t1.data[i] - t2.data[i]; i++; }

    return Tensor(t1.rank, t1.shape, data);
}

struct tensor mul(struct tensor t1, struct tensor t2){

    int data[t1.size];

    int i = 0;
    while (i < t1.size) { data[i] = t1.data[i] * t2.data[i]; i++; }

    return Tensor(t1.rank, t1.shape, data);
}

还有更多功能。每个运算符一个,格式如下

struct tensor genericfunc(struct tensor t1, struct tensor t2){

    int data[t1.size];

    int i = 0;
    while (i < t1.size) { data[i] = t1.data[i] ?? t2.data[i]; i++; }

    return Tensor(t1.rank, t1.shape, data);
}

【问题讨论】:

  • 可以,但这取决于您如何灵活更改该功能。例如,泛型函数是否可以接收第三个参数作为指示符?
  • 是的,有可能通过指标

标签: c optimization code-formatting generalization


【解决方案1】:
#define definefunc(name, op)                \
Tensor name(Tensor t1, Tensor t2) {         \
    int data[t1.size];                      \
    for (int i = 0; i < t1.size; ++i)       \
       data[i] = t1.data[i] op t2.data[i];  \
                                            \
    return Tensor(t1.rank, t1.shape, data); \
}

definefunc(add, +)
definefunc(sub, -)
definefunc(mul, *)

typedef int (*TensorOp)(int, int)

Tensor genericfunc(Tensor t1, Tensor t2, TensorOp op) {
    int data[t1.size];
    for (int i = 0; i < t1.size; ++i)
       data[i] = op(t1.data[i], t2.data[i]);

    return Tensor(t1.rank, t1.shape, data);
}

int TensorOp_add(int a, int b) { return a + b; }
int TensorOp_sub(int a, int b) { return a - b; }
int TensorOp_mul(int a, int b) { return a * b; }

Tensor add(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_add); }
Tensor sub(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_sub); }
Tensor mul(Tensor t1, Tensor t2) { return genericfunc(t1, t2, TensorOp_mul); }

上述 sn-ps 假定以下内容以避免在任何地方使用struct

typedef struct tensor Tensor;

【讨论】:

    【解决方案2】:

    老实说,这听起来像是一个不需要修复的问题。

    但你可以这样做:

    struct tensor genericfunc(struct tensor t1, char op, struct tensor t2) {
        int data[t1.size];
    
        int i = 0;
        switch(op) {
        case '+': while (i < t1.size) { data[i] = t1.data[i] + t2.data[i]; i++; } break;
        // Implement the rest of the ops here
        }
    
        return Tensor(t1.rank, t1.shape, data);
    }
    

    【讨论】:

      【解决方案3】:

      你可以为你的参数添加一个决策者

      struct tensor add(struct tensor t1, struct tensor t2,int decider){
          if(decider==1){
          int data[t1.size];
      
          int i = 0;
          while (i < t1.size) { data[i] = t1.data[i] + t2.data[i]; i++; }
      
          return Tensor(t1.rank, t1.shape, data);
          }
      
         if(decider ==2){
      
          int data[t1.size];
      
          int i = 0;
          while (i < t1.size) { data[i] = t1.data[i] - t2.data[i]; i++; }
      
          return Tensor(t1.rank, t1.shape, data);
      }
      
      if (decider ==3){
      
          int data[t1.size];
      
          int i = 0;
          while (i < t1.size) { data[i] = t1.data[i] * t2.data[i]; i++; }
      
          return Tensor(t1.rank, t1.shape, data);
      }
      

      我希望这就是你想要的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 2012-05-05
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多