実現したいこと
複数の型を取れる配列の各要素に対し、その要素の型に依らず同じような処理を実行したい。
前提
言語はC++です。
下記の簡単なサンプルコードでは、複数の型のデータを一つの配列でまとめて、各要素に同じような処理を実行しています。
このコードでも問題はないのですが、test[i].type
の値で分岐しているところが冗長な気がします。
値のやりとりするとき毎回こんなキャストしなければいけないかとも思います。
long long 型にキャストして出力、というのは型に依らず同じ処理なので、一文にまとめられる上手い書き方があればいいな、というのが今回の質問です。
なお、今回void*には(unsigned )int, (unsigned )long long, charなどの数値型しか入らないとします。(キャスト不可な場合は考えない?)
該当のソースコード
C++
1//main.cpp 2 3#include <iostream> 4#include <vector> 5#include <stack> 6 7 8using namespace std; 9 10class TEST{ 11public: 12 void* val; 13 int type; 14}; 15 16int main(void) { 17 int a = 1; 18 char b = 'c'; 19 long long c = 10000; 20 21 22 TEST test[3]; 23 test[0].val = &a; 24 test[0].type = 0; 25 test[1].val = &b; 26 test[1].type = 1; 27 test[2].val = &c; 28 test[2].type = 2; 29 30 for (int i = 0; i < 3; i++) { 31 switch (test[i].type) 32 { 33 case 0: 34 cout << (long long)*(int *)test[i].val << endl; 35 break; 36 case 1: 37 cout << (long long)*(char *)test[i].val << endl; 38 break; 39 case 2: 40 cout << (long long)*(long long *)test[i].val << endl; 41 break; 42 default: 43 break; 44 } 45 } 46}
試したこと
templateやanyなどで解決できそうな気もしましたが、やはりうまい方法が思い浮かびません。可能なら、その方法をご教示願います。
↓こんなのもありました。これなら実現できますが、上記のレベルでここまで大層なことをしないといけないでしょうか。
https://qiita.com/mm_sys/items/9afb811c2e0c67a5cfd5
([C++] 異なる型を一つの配列で管理するクラス)
備考
あくまで知見を広めたい為の質問ですので、C++のバージョンなどの環境によって可能/不可能変わるような書き方でも是非教えて頂きたいです。
以上、宜しくお願い致します。
回答4件
あなたの回答
tips
プレビュー