【问题标题】:C++ wrapping overloaded functionsC++ 包装重载函数
【发布时间】:2013-03-29 18:34:46
【问题描述】:

我想为一堆重载函数创建一个包装

void print(int i);
void print(long i);
void print(char* s);
...

void myPrint(int x, int y, ??? toPrint){
    moveTo(x,y);
    print(toPrint);
}

我该怎么做?可以不用模板吗?

【问题讨论】:

  • 模板有什么问题?
  • 这是一个模板函数的经典例子。您是否有理由放弃该语言功能? toPrint 可以是任何数据类型完全,还是只是intlongchar
  • 我正在为微控制器 (Arduino) 编写代码,模板似乎不是默认功能...
  • 你不能将参数设为全局,然后在你的函数 myPrint() 中使用它,而不必通过参数列表接收它吗?
  • @Arslan 对不起,忘了说,这个函数实际上是一个类方法,所以 globals 不会做得很好:) 无论如何谢谢!

标签: c++ overloading


【解决方案1】:

如果您不能使用模板,您可以对myPrint 采取与print 相同的方法。

void myPrint(int x, int y, int toPrint){
    moveTo(x,y);
    print(toPrint);
}

void myPrint(int x, int y, long toPrint){
    moveTo(x,y);
    print(toPrint);
}

void myPrint(int x, int y, char* toPrint){
    moveTo(x,y);
    print(toPrint);
}

由于您正在进行嵌入式编码,因此您也可以为自己使用宏找借口。

#define MYPRINT( x, y, toPrint ) \
    do {                         \
        moveTo(x,y);             \
        print(toPrint);          \
    } while(false)

【讨论】:

  • 感谢@Drew,这似乎是最酷的! :) 但是没有 do...while(false) 你能做到吗?
  • @XunYang 乐于助人!如果你很小心,你可以省略 do/while。这个链接解释了我为什么使用它。 stackoverflow.com/questions/154136
【解决方案2】:

我想您可以编写三个单独的包装器。它相当于模板将产生的内容(即一些代码膨胀)。

void myPrint(int x, int y, int toPrint) {
    moveTo(x,y);
    print(toPrint);
}

void myPrint(int x, int y, long toPrint) {
    moveTo(x,y);
    print(toPrint);
}

void myPrint(int x, int y, char *toPrint) {
    moveTo(x,y);
    print(toPrint);
}

我不一定推荐这个,因为代码隐藏宏现在非常不受欢迎,但您可以使用预处理器宏作为模板替换。

#define DEFINE_MY_PRINT(Type)                  \
    void myPrint(int x, int y, Type toPrint) { \
        moveTo(x,y);                           \
        print(toPrint);                        \
    }

DEFINE_MY_PRINT(int)
DEFINE_MY_PRINT(long)
DEFINE_MY_PRINT(char *)

【讨论】:

    【解决方案3】:

    最好使用模板,但您可以(ab)使用预处理器:

    #define MY_PRINT(T) void myPrint(int x, int y, T toPrint) \
    { \
        moveTo(x,y); \
        print(toPrint); \
    }
    
    MY_PRINT(int)
    MY_PRINT(long)
    MY_PRINT(char*)
    

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多