何でも入るけど、何指してるかは保持してるvoidポインタを使ったポリモ、ではなくて、
どっちかって言うと、ポインタの共用体だな。
( type_a | type_b | type_c ) *p;
宣言はこんな感じになるだろうな。type_aの型値が「1」で、以降連番で良いだろう。型値「0」は未代入時。
型値「0」で関数の引数に渡されたら、実行時エラーのヌルポだな。
ただ、これだと予めポリモ対象の型が全てわかってないとダメで、
所謂フレームワーク的なことが出来ないから、型推論もつける。予約語はautoで良いだろう。
auto *p;
p = &type_a_inst;
p = &type_b_inst;
p = &type_c_inst;
こんなプログラムを書くと、型推論で、pの型は勝手に( ( type_a | type_b | type_c ) * ) となる。
そのポインターの取りうる型を全て調べて、共用体風にして、頭から型値を割り振る。