Вы хотите вернуть void*
и выполнить приведение к соответствующему SomeType**
в коде реализации. Это потому, что void**
имеет странную семантику (которую я не могу найти в Google сейчас). Он также сообщает пользователю больше информации, чем ему действительно нужно. Весь смысл использования void*
для начала заключался в том, чтобы не предоставлять пользователю информацию, которая ему не нужна.
Если это вариант, я бы лично рекомендовал вообще избегать void*
и просто предоставлять непрозрачный тип ссылки, чтобы они могли вызывать ваши API. Один из способов сделать это - определить поддельную структуру, такую как struct GameObjectRef {};
, и передать пользователю обратно GameObjectRef*
, приведенный от любого указателя, который фактически использует ваша система. Это позволяет пользователю писать строго типизированный код, поэтому он не может случайно предоставить неверный тип указателя для ваших функций, как они могут это сделать с помощью void*
.
Как работают указатели (и указатели на указатели):
Представьте, что вы спрашиваете меня, где живет ваша тетя. Затем я вручаю вам лист бумаги с адресом, по которому можно перейти. Этот лист бумаги - указатель на дом.
Теперь возьмите этот листок бумаги с адресом, сфотографируйте его цифровой камерой и поместите изображение на свой личный вики-сайт.
Теперь, если ваша сестра звонит, спрашивая адрес вашей тети, просто скажите ей, чтобы он нашел ее в вашей вики. Если она попросит URL, напишите ее на листе бумаги для нее. Этот второй лист бумаги - указатель на указатель на дом.
Вы можете видеть, что адрес не совпадает с реальным. Тот факт, что у кого-то есть адрес вашего сайта, не означает, что он знает адрес вашей тети. И только потому, что у них есть адрес твоей тети, не значит, что они стучат в ее дверь. То же самое верно для указателей на объекты.
Вы также можете увидеть, как вы можете делать копии адресов (указателей), но это не делает копию базового объекта. Когда вы фотографируете адрес своей тети, ваша тетя не получает новый блестящий дом.
И вы можете видеть, как разыменование указателя приведет вас обратно к исходному объекту. Если вы зайдете на вики-сайт, вы получите адрес своей тети. Если вы едете по этому адресу, вы можете оставить посылку у ее порога.
Обратите внимание, что это не идеальные метафоры, но они достаточно близки, чтобы быть несколько описательными. Реальные указатели на указатели намного чище, чем эти примеры. Они описывают только две вещи - тип конечного объекта (скажем, GameObject
) и количество уровней косвенности (скажем, GameObject**
- два уровня).