私はあなたがvoid*
を使用して、実質的に型指定されていない戻り値を使用する必要がなぜわからないんだけど、のは、そのための理由があると仮定してみましょう。
実際には、アレイを作成して使用するという2つの問題があります。
ロジックに基づいて異なるタイプの配列を作成する場合は、どうにかしてif
またはswitch()
を処理する必要があります。希望の結果タイプを決定するロジックを他にどのように表現しますか?しかし、あなたが好きなら、result = malloc(nrOfItems*sizeOfItem)
のようなものを使用して、算術計算に基づいて好きなロジックでsizeOfItem
を決めることもできます。
もっと面白くて重要なことは、配列の要素にアクセスするには配列の要素の型やサイズに関する知識が必要であるため、呼び出し元がそれぞれの関数の結果を使用する方法です。
と仮定、例えば、次のコード:
void* getSomeItems() {
if (std::rand() > 100000)
return new char[200];
else
return new double[200];
}
int main() {
void* someItems = getSomeItems();
double c = ((double*)someItems)[199]; // Critical!
// how shall we know if element type is double?
// if rand() decided to create items of type char,
// this code accesses non allocated memory
...
だから、あなたの関数は、型が作成され(実際にも、配列の大きさ)、戻り値された情報をお返しすることができない限り、ほとんど不必要です。
これにはvoid*
を使用しないことをおすすめします。関数を呼び出す前に型を知っているなら、テンプレート、ベクトルなどを使うことができます。呼び出す前に型やサイズが分からない場合は、割り当てられた配列以外に型/サイズ情報も提供する構造体を返します。
ところで:delete[]/free
最後に結果を忘れないでください。
[boost :: variant](http://www.boost.org/doc/libs/1_63_0/doc/html/variant.html)かもしれません。 –
あなたの問題が 'if/elseのみである場合にスイッチを使用してください。 – Raindrop7
テンプレート特化 – nikau6