例えば、int型のリスト構造を作りたいとします。
c
1/* 01.c */ 2struct int_node; 3typedef struct int_node int_NODE; 4typedef int_NODE* int_LIST; 5 6int_LIST int_LIST_add_first( int_LIST list, int n ); 7 8typedef struct int_node { 9 int data; 10 int_LIST next; 11}; 12 13int_LIST int_LIST_add_first( int_LIST list, int n ) { 14 /* 処理を記述 */ 15}
普通ならこんな感じで書くわけですが、int_node のメンバに関数ポインタを持たせることで、もっと便利になりそうです。
構造体のサイズが大きくなってしまって、メモリ効率的には非効率ですが、そこは気にしないことにします。
c
1/* 02.c */ 2struct int_node; 3typedef struct int_node int_NODE; 4typedef int_NODE* int_LIST; 5 6int_LIST int_LIST_init(); 7static int_LIST int_LIST_add_first( int_LIST, int ); 8 9typedef struct int_node { 10 int data; 11 int_LIST next; 12 int_LIST (*add_first)( int_LIST, int ); 13}; 14 15int_LIST int_LIST_init( void ) { 16 int_LIST list = (int_LIST)malloc( sizeof(int_NODE) ); 17 list->add_first = int_LIST_add_first; 18 return list; 19} 20 21static int_LIST int_LIST_add_first( int_LIST list, int n ) { 22 /* 処理を記述 */ 23} 24
これで、使用側では以下のように使うことになります。
c
1int main( void ) { 2 int_LIST il = int_LIST_init(); 3 il->add_first( il, 1 ); 4}
ここで、il->add_first( il, 1 );
と書くのではなく、il->add_first(1);
と書けるようになれば、使いやすくなります。
いろいろ考えましたが、うまいやり方が思い浮かびません。
自分なりに考えたのは、
c
1#define HOGE(object,function,arg) ( typeof(object)##_LIST_##function(object, arg) )
こんな感じのマクロを書きます。01.c にこれを加えると、
HOGE(il,add_first,1);
と書くと、( int_LIST_add_first(il,1) );
と展開されます。
でもあんまりすっきりした書き方にならないです。
引数が2つ以上の場合はうまくいかないですし。
il->add_first(1)
をint_LIST_add_first(il, 1)
と展開させるのが理想なのですが。
c言語だと、thisポインタも、メンバ関数もないため、すごく難しいです。
上手いやり方はないでしょうか。
コンパイラは gcc version 5.3.0 (GCC) です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。