В программировании на C ++ мне часто нужно получить адрес указателя и преобразовать его в void **
.Например, обычно при использовании CUDA:
int main() {
float *data;
size_t size = sizeof(float) * 1024;
CUDA_CHECK(cudaMalloc((void **)&data, size)); // question about this line
...
CUDA_CHECK(cudaFree(static_cast<void *>(data)));
return 0;
}
Моя проблема в том, что приведение типов float **
к void **
с использованием типа C раздражает меня, так как я не хочу использовать этов программировании на C ++.
До сих пор я использовал reinterpret_cast<void **>(&data)
, но я не доволен этим.По какой-то причине я не думаю, что это правильный способ сделать это.
Я пытался сделать &static_cast<void *>(data)
один раз очень глупо, поскольку это явно не помогло при попытке получить адрес из значения.
Я провел некоторый поиск в Google и переполнении стека, но мне сложно найти хорошие ключевые слова для запроса.
Я также изучал концепцию ссылки на rvalue, но яне думаю, что он был разработан для этой проблемы.
Так что мой вопрос в том, что является правильным способом C ++ для преобразования из float **
в void **
в этом контексте?Кроме того, есть ли способ от static_cast
до void *
и по-прежнему получить адрес из возвращаемого значения, например, ссылку на rvalue?(PS: я до сих пор не совсем понимаю ссылку на rvalue, поэтому простите меня, если это ошибка новичка)
Редактировать --------------
Извините, я не прояснил себя.Я не хочу объявлять void *
здесь.Я просто хочу как-нибудь сделать «правильный» приём C ++, чтобы выполнить это, желательно в одну строку.
Подробнее Редактировать ----------
Я понимаю, что использование void *
является правильным способом, как @MM указал ниже (на самом деле, это именно то, что я делал в течение некоторого времени).Мне просто любопытно, есть ли какой-нибудь правильный способ избежать использования void *
.