あなたの与えられたリンクは、部分的に真実です。特に、オブジェクト (構造体) を扱っていない場合、または一般的にまだ割り当てられていない型を扱っている場合。int、double などのネイティブ型と void ポインター (コンテナーなど) を使用することは、ほとんどの場合厄介な問題です。データ型に追加のメモリを割り当てる必要があります。
最初の選択は、移植性がなく、値として 0 が許可されていない可能性があり、単純に気分が悪いため、悪いです。2番目の選択肢はメモリを浪費し、余分な割り当てのために実際に(大規模な)速度低下を引き起こします。
しかし、ほとんどの場合、ネイティブ型を扱っているのではなく、既に割り当てられているオブジェクトへのポインタを使って、オブジェクトを扱っています。少なくとも私はそうしています。整数や倍精度のハッシュ テーブルやマップは必要ありませんでした。また、ポインターのタイプセーフのためだけに異なるコンテナー実装を使用することは、私には間違っているように感じます。実装ごとにバイナリサイズが増加するためです。したがって、ポインタを格納するためのコンテナのみが必要な場合は、void ポインタを使用しても速度が低下したり、メモリが無駄になったりすることはありません。
ただし、これはコンテナの実装に関するものでした。ところで、あなたが言及したブログ記事のように。一般に、void ポインターを使用しないと達成できないことがたくさんあります。