マクロによるテンプレートもどき

C++テンプレートテクニック 1-2


お次はマクロを利用してテンプレートっぽいことをやるという話。ということで前回の記事で作ったreverseをマクロテンプレートもどきで再実装してみた。

#include <iostream>
#define ARRAY_NUM(a) (sizeof(a)/sizeof(a[0]))
using std::cout; using std::endl;

#define reverse(T,a,num) T##reverse(a,num);
#define TEMPLATEreverse(T,a,num) \
void T##reverse(T* a,int num,int start=0) { \
    if ( (num-1)/2 <= start ) return; \
    T tmp = a[start]; \
    a[start] = a[num-1-start]; \
    a[num-1-start] = tmp; \
    T##reverse(a,num,++start); \
}

// 型推論ができないので使う型を宣言
TEMPLATEreverse(int,a,num);

int main () {
    int a[] = {1,2,3,4,5,6,7,8,9,10};
    int num = ARRAY_NUM(a);
    
    reverse(int,a,num);
    
    for(int i=0;i<num;++i){
        cout << a[i] << endl;
    }
    
    return 0;
}

しっかし、これはひどすぎるね。可読性が悪すぎるし型推論ができないので結局どこかで使用する型の分だけ宣言しとかないといけないしまるで使い物にならない。