C言語のジェネリクスサポート
全く知らなかったのだけれど,C11の新機能として_Generic
という組み込み関数が提供されていた.
Generic selection - cppreference.com
というのをこのブログを見て気づいたんですが,
#include <stdio.h> int main() { char* x = "foo"; printf("Type of x is: %s\n", _Generic(x, char*: "string", int: "int")); return 0; }
これは完全に動くコード (最初よく文章を読んでなくて,大方擬似コードだろうと侮っていたら本当に動いて驚いた).
だいたい分かると思うんですが,上記のコードは char*
の引数が_Generic
に渡されるとstring
という文字列を出力し,int
の引数が与えられるとint
という文字列が出力されるという挙動をします.
しかしこれが「リッチなgenericsか」というとそうではなくて,_Generic
の引数に延々と型とそれに対応するvalueを書いていかなければならないので,どちらかと言うとType Assertionに近いイメージ.JavaのgenericsやC++のTemplateのようにコンパイル時に良い感じに自動解決してくれるような類のものではない.惜しいですね.とはいえ便利ではある.
問題としてはC11なんてモダンなものを使う環境ってあるの……? という部分であるが……
Code sampleとしては以下がわかりやすかった: http://www.robertgamble.net/2012/01/c11-generic-selections.html