2

オーバーロードされた関数の束のラップを作成したい

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

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

どうすればいいですか?テンプレートなしで行くことは可能ですか?

4

3 に答える 3

2

テンプレートを使用できない場合は、 で行ったのと同じアプローチを取ることができ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)
于 2013-03-29T18:39:59.123 に答える
2

3 つの個別のラッパーを作成できると思います。これは、テンプレートが生成するものと同じです (つまり、少しコードが肥大化します)。

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 *)
于 2013-03-29T18:40:38.910 に答える
1

テンプレートが優先されますが、プリプロセッサを (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*)
于 2013-03-29T18:36:31.920 に答える