Я пытался найти это в Stack Overflow, но я думаю, что из-за синтаксиса и незнания точно, что искать, я немного растерялся.
Я видел, как (void*)
использовался для приведения типов, обычно для вызовов функций. Для чего это используется?
Я пытался найти это в Stack Overflow, но я думаю, что из-за синтаксиса и незнания точно, что искать, я немного растерялся.
Я видел, как (void*)
использовался для приведения типов, обычно для вызовов функций. Для чего это используется?
void*
, обычно называемый пустым указателем, представляет собой общий тип указателя, который может указывать на объект любого типа. Указатели на разные типы объектов практически одинаковы в памяти, поэтому вы можете использовать пустые указатели, чтобы избежать проверки типов, что было бы полезно при написании функций, обрабатывающих несколько типов данных.
Пустые указатели более полезны в C, чем в C++. Обычно вам следует избегать использования указателей void и вместо этого использовать перегрузку функций или шаблоны. Проверка типов — это хорошо!
Пустой указатель — это указатель на значение, тип и размер которого неизвестны. Я приведу пример того, как его можно использовать в C, хотя другие комментаторы правы, говоря, что его вообще не следует использовать (и, по сути, не нужно) в C++.
Предположим, у вас есть структура, в которой хранятся ключ и значение. Это может быть определено так:
typedef struct item_t
{
char *key;
int value;
} item_t;
Таким образом, вы можете использовать эту структуру для сопоставления любого строкового ключа с целочисленным значением. Но что, если вы хотите сохранить произвольное значение? Может быть, вы хотите, чтобы некоторые ключи совпадали с целыми числами, а некоторые — с двойными? Вам нужно определить свою структуру таким образом, чтобы она отслеживала (с помощью указателя) значение произвольного типа и размера. В этом случае void *
отвечает всем требованиям:
typedef struct item_t
{
char *key;
void *value;
} item_t;
Теперь, если ваше значение — int, вы можете получить его значение, используя (int *) value
, а если его значение — двойное, вы можете сделать это, используя (double *) value
. Это предполагает, конечно, что код, использующий структуру, знает, какой тип он ожидает увидеть в каком контексте.
Однако в C++ эта же функциональность обычно достигается не за счет использования void *
, а за счет использования таких вещей, как шаблоны или суперкласс, от которых происходят все ваши различные типы (например, Object в Java — список объектов может хранить некоторые строки, некоторые целые числа и т. д.).
Это наиболее общий способ предоставления указателя на объект в C/C++. Как object
в C# или Java.
Это в основном используется, когда вы хотите передать параметр, который может иметь разные состояния.
Например, в вашем общем коде вы должны передать void*
в качестве параметра, а затем в «конкретной» реализации этого кода вы должны привести void*
к тому, что хотите.
Общий код, abc.h
void Test(void* pHandle);
Код Windows, abc.cpp
void Test(void* phandle)
{
WindowsStructure* myStruct = (WindowsStructure*)(pHandle);
myStruct->getWhatINeed;
}
Код Linux, abc.cpp
void Test(void* phandle)
{
LinuxStructure* myStruct = (LinuxStructure*)(pHandle);
myStruct->getWhatINeed;
}
(void*)
? - person Pubby   schedule 01.06.2013boost::variant
иboost::any
- хорошие альтернативы в соответствующих областях. - person chris   schedule 01.06.2013