比较器作为函数参数

时间:2015-12-05 17:48:12

标签: c c89

C89中是否有可能将操作符作为函数参数传递?我的意思是传递示例<==>=等等。像Java中的自定义比较器,但只传递特定符号。也许有特殊类型的预处理器宏的解决方案(我尝试使用#&#39;#&#39;取自处理器宏)?

我知道有关函数的指针,但我想要一些不同的东西。

示例:

void fun(int a, int b, comperator)
{
    if(a comperator b)
        ........
}

3 个答案:

答案 0 :(得分:1)

您可以使用宏。但请记住 - 宏不是一个功能;它有不同的(丑陋的)语法,一些特定的问题,一些优点等等。

假设你有一个功能:

int fun(int x, int y)
{
    if (x < y)
        return 1;
    else if (x < 2 * y)
        return 2;
    else if (x < 2 * y)
        return 3;
    else
        return 4;
}

要使用其他比较器,请先将其转换为宏:

#define FUN(x, y) \
x < y ? 1 : \
x < 2 * y ? 2 : \
x < 3 * y ? 3 : \
4

这种转换非常难看(通常比我的例子更难看),并不总是可行,但现在你可以添加一个比较器:

#define FUN(x, y, c) \
x c y ? 1 : \
x c 2 * y ? 2 : \
x c 3 * y ? 3 : \
4

用法:

printf("%d\n", FUN(3, 5, <));

(注意:在宏中,你应该在变量周围添加括号,例如here;为清楚起见,我省略了它们。)

答案 1 :(得分:0)

不,你不能,只是像字符串一样传递它并在函数中进行测试

答案 2 :(得分:0)

最简单的方法是使用代表比较器的枚举,但通过一些操作,你可以编写一个宏包装器来fun()调用funLT(),funGT ......或者将比较器枚举到LT,GT,..用于开关盒。

如果fun(...)相当大,您可能希望在适当的位置使用函数内部的枚举和开关案例。

enum{LT,GT,EQ,NE,LE,GE};

#define fun(a,b,OP) fun_(a,b, 
   (0 OP 1) \
      ? (1 OP 0) \
         ? NE \
         : (0 OP 0) \
            ? LE \
            : LT \
      : (0 OP 0) \
         ? (1 OP 0) \
            ? GE \
            : EQ \
         : GT \
    )

fun(int a, int b, int op){
//code
  switch(op){
  case GE: //etc...
  }
//more code
}

如果函数很小,您可能希望为每个运算符分别具有单独的函数

#define fun(a,b,OP) \ 
   (0 OP 1) \
      ? (1 OP 0) \
         ? funNE((a),(b)) \
         : (0 OP 0) \
            ? funLE((a),(b)) \
            : funLT((a),(b)) \
      : (0 OP 0) \
         ? (1 OP 0) \
            ? funGE((a),(b)) \
            : funEQ((a),(b)) \
         : funGT((a),(b))